/ Hex Artifact Content
Login

Artifact 91d7462aa2429e30d64c705f75ba36cace90c241:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
8460: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
8470: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
8480: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8490: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
84a0: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
84b0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
84c0: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
84d0: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
84e0: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
84f0: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8500: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8510: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8520: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
8530: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
8540: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
8550: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
8560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8570: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
8580: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8590: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
85a0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
85c0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
85d0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
85e0: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
85f0: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8600: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8610: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8620: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
8630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8640: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
8670: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
8680: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8690: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
86c0: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
86d0: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
86e0: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
86f0: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
8700: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
8710: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
8720: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
8730: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
8740: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
8750: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8760: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8770: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8780: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8790: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
87a0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
87b0: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
87c0: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
87d0: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
87e0: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
87f0: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
8800: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8810: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8820: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8830: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8840: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8850: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8860: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8870: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8880: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8890: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
88a0: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
88b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
88c0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88d0: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
88e0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
88f0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8900: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8910: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8920: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8930: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8940: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8950: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8960: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8970: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
89a0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
89b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
89c0: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
89d0: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
89e0: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
89f0: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8a00: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8a10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8a20: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8a30: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8a40: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8a50: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8a60: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8a70: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8a80: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8a90: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8aa0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8ab0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8ac0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8ae0: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8af0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8b00: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8b10: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8b20: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8b30: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8b40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8b50: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8b60: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8b70: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8b80: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8b90: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8ba0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8bb0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8bc0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8bd0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8be0: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8bf0: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8c00: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8c10: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8c20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8c30: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8c40: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8c50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8c60: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8c70: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8c80: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8c90: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8ca0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8cb0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
8cc0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
8cd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
8ce0: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
8cf0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
8d00: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
8d10: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
8d20: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
8d30: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
8d40: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
8d50: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
8d60: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
8d70: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
8d80: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
8d90: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
8da0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
8db0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
8dc0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
8dd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
8de0: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
8df0: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
8e00: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
8e10: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
8e20: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
8e30: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
8e40: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
8e50: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
8e60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
8e70: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
8e80: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
8e90: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
8ea0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
8eb0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
8ec0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
8ed0: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
8ee0: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
8ef0: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
8f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8f10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
8f20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
8f30: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
8f40: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
8f50: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
8f60: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
8f70: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8f80: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
8f90: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
8fa0: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
8fb0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
8fc0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
8fd0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
8fe0: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
8ff0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9000: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9010: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9020: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9030: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
9040: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
9050: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
9060: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
9070: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
9080: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
9090: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
90a0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
90b0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
90c0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
90d0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
90e0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
90f0: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9100: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9110: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9120: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9130: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
9140: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
9150: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
9160: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
9170: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
9180: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
9190: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
91a0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
91b0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
91c0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
91d0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
91e0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
91f0: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9200: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9210: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9220: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9230: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
9240: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
9250: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
9260: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
9270: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
9280: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
9290: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
92a0: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
92b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
92c0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
92d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
92e0: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
92f0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9300: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9310: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9320: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9330: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
9340: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
9350: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
9360: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
9370: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
9380: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
9390: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
93a0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
93b0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
93c0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
93d0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
93e0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
93f0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9400: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9410: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9420: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9430: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
9440: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9450: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
9460: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
9470: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
9480: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
9490: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
94a0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
94b0: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
94c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
94d0: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20  e if this pager 
94e0: 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65  uses a write-ahe
94f0: 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f  ad log instead o
9500: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72  f the usual.** r
9510: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
9520: 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   Otherwise false
9530: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
9540: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61  ITE_OMIT_WAL.sta
9550: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73 65  tic int pagerUse
9560: 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
9570: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  r){.  return (pP
9580: 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a  ager->pWal!=0);.
9590: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
95a0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29 20   pagerUseWal(x) 
95b0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
95c0: 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30  RollbackWal(x) 0
95d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 57  .# define pagerW
95e0: 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79  alFrames(v,w,x,y
95f0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9600: 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
9610: 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  nt(z) SQLITE_OK.
9620: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65  # define pagerBe
9630: 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
9640: 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  on(z) SQLITE_OK.
9650: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
9660: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
9670: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
9680: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
9690: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
96a0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  );.**.** This fu
96b0: 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79  nction runs many
96c0: 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20   asserts to try 
96d0: 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73  to find inconsis
96e0: 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68  tencies in.** th
96f0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
9700: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
9710: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
9720: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
9730: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
9740: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
9750: 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61  r = p;..  /* Sta
9760: 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  te must be valid
9770: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
9780: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9790: 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70  OPEN.       || p
97a0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
97b0: 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c  READER.       ||
97c0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97d0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
97e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
97f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9800: 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
9810: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9820: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
9830: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
9840: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9850: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
9860: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9870: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
9880: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64   );..  /* Regard
9890: 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72  less of the curr
98a0: 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d  ent state, a tem
98b0: 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  p-file connectio
98c0: 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73  n always behaves
98d0: 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68  .  ** as if it h
98e0: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
98f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9900: 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65  base file. It ne
9910: 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a  ver updates.  **
9920: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
9930: 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68  ter field, so th
9940: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
9950: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
9960: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
9970: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
9980: 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d  ==0 || p->eLock=
9990: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
99a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
99b0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
99c0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
99d0: 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20  ntDone );..  /* 
99e0: 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61  If the useJourna
99f0: 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  l flag is clear,
9a00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9a10: 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e  e must be "OFF".
9a20: 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68   .  ** And if th
9a30: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
9a40: 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75  s "OFF", the jou
9a50: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e  rnal file must n
9a60: 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f  ot be open..  */
9a70: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
9a80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9a90: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9aa0: 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61   || p->useJourna
9ab0: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
9ac0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
9ad0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9ae0: 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28  _OFF || !isOpen(
9af0: 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  p->jfd) );..  /*
9b00: 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44   Check that MEMD
9b10: 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63  B implies noSync
9b20: 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  . And an in-memo
9b30: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63  ry journal. Sinc
9b40: 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61  e .  ** this mea
9b50: 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ns an in-memory 
9b60: 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e  pager performs n
9b70: 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20  o IO at all, it 
9b80: 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72  cannot encounter
9b90: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51   .  ** either SQ
9ba0: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
9bb0: 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67  LITE_FULL during
9bc0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69   rollback or whi
9bd0: 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20  le finalizing . 
9be0: 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   ** a journal fi
9bf0: 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68  le. (although th
9c00: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
9c10: 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  nal implementati
9c20: 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74  on may .  ** ret
9c30: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9c40: 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65  _NOMEM while the
9c50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
9c60: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e   being written).
9c70: 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65   It .  ** is the
9c80: 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69  refore not possi
9c90: 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  ble for an in-me
9ca0: 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e  mory pager to en
9cb0: 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20  ter the ERROR . 
9cc0: 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a   ** state..  */.
9cd0: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
9ce0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f     assert( p->no
9cf0: 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65  Sync );.    asse
9d00: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9d10: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9d20: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
9d30: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9d40: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9d50: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
9d60: 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
9d70: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50  rt( p->eState!=P
9d80: 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d  AGER_ERROR && p-
9d90: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
9da0: 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  PEN );.    asser
9db0: 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
9dc0: 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )==0 );.  }..  /
9dd0: 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74  * If changeCount
9de0: 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52  Done is set, a R
9df0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20  ESERVED lock or 
9e00: 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
9e10: 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  held.  ** on the
9e20: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
9e30: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68  sert( pPager->ch
9e40: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30  angeCountDone==0
9e50: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
9e60: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9e70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9e80: 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  >eLock!=PENDING_
9e90: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63  LOCK );..  switc
9ea0: 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a  h( p->eState ){.
9eb0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f      case PAGER_O
9ec0: 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72  PEN:.      asser
9ed0: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
9ee0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9ef0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f00: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9f10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
9f20: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
9f30: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
9f40: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
9f50: 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72  File );.      br
9f60: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9f70: 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20  AGER_READER:.   
9f80: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f90: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9fa0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9fb0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9fc0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
9fd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9fe0: 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
9ff0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72  LOCK );.      br
a000: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a010: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
a020: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a030: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
a040: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
a050: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a060: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a070: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
a080: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a090: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
a0a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a0b0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a0c0: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
a0d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a0e0: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
a0f0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
a100: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a110: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a120: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a130: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a140: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a150: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a160: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a170: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a180: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
a190: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
a1a0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a1b0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
a1c0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a1d0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a1e0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a1f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a200: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a210: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a220: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a230: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a240: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
a250: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
a260: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
a270: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
a280: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
a290: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
a2a0: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
a2b0: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
a2c0: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
a2d0: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
a2e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
a2f0: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
a300: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
a310: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
a320: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
a330: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a340: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a350: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a360: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
a370: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a380: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a390: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a3a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a3b0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a3c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a3d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a3e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a3f0: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
a400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a410: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a420: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a430: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a450: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a460: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a470: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a480: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a490: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
a4a0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a4b0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a4c0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a4d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a4e0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a4f0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a500: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a510: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a520: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a530: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
a540: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a550: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a560: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a570: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a580: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a590: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a5a0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a5b0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a5c0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a5d0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a5e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a5f0: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a600: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a610: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a620: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a630: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a650: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a660: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a670: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a680: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a690: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a6a0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a6b0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a6c0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a6d0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a6e0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a6f0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a700: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a710: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a720: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a730: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a740: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a750: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a760: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a770: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a780: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a790: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a7a0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a7b0: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a7c0: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a7d0: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a7e0: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a7f0: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a800: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a810: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a830: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a840: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a850: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a860: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a870: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a880: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a  ->pPCache)>0 );.
a890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
a8a0: 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
a8b0: 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
a8c0: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64   NDEBUG */..#ifd
a8d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
a8e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a8f0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d  pointer to a hum
a900: 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69  an readable stri
a910: 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62  ng in a static b
a920: 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  uffer.** contain
a930: 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66  ing the state of
a940: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
a950: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
a960: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a  rgument. This.**
a970: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
a980: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64  be used within d
a990: 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78  ebuggers. For ex
a9a0: 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74  ample, as an alt
a9b0: 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22  ernative.** to "
a9c0: 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69  print *pPager" i
a9d0: 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64  n gdb:.**.** (gd
a9e0: 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20  b) printf "%s", 
a9f0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aa00: 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61  e(pPager).*/.sta
aa10: 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f  tic char *print_
aa20: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
aa30: 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20  r *p){.  static 
aa40: 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b  char zRet[1024];
aa50: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
aa60: 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c  intf(1024, zRet,
aa70: 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65  .      "Filename
aa80: 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20  :      %s\n".   
aa90: 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20     "State:      
aaa0: 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64     %s errCode=%d
aab0: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a  \n".      "Lock:
aac0: 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a            %s\n".
aad0: 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d        "Locking m
aae0: 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ode:  locking_mo
aaf0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
ab00: 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a  Journal mode:  j
ab10: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e  ournal_mode=%s\n
ab20: 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67  ".      "Backing
ab30: 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65   store: tempFile
ab40: 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65  =%d memDb=%d use
ab50: 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20  Journal=%d\n".  
ab60: 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20      "Journal:   
ab70: 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25      journalOff=%
ab80: 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25  lld journalHdr=%
ab90: 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69  lld\n".      "Si
aba0: 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73  ze:          dbs
abb0: 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a  ize=%d dbOrigSiz
abc0: 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d  e=%d dbFileSize=
abd0: 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d  %d\n".      , p-
abe0: 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20  >zFilename.     
abf0: 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41   , p->eState==PA
ac00: 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20  GER_OPEN        
ac10: 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20      ? "OPEN" :. 
ac20: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ac30: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20  ==PAGER_READER  
ac40: 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45          ? "READE
ac50: 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  R" :.        p->
ac60: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
ac70: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20  ITER_LOCKED   ? 
ac80: 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20  "WRITER_LOCKED" 
ac90: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
aca0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
acb0: 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52  R_CACHEMOD ? "WR
acc0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a  ITER_CACHEMOD" :
acd0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ace0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
acf0: 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49  _DBMOD    ? "WRI
ad00: 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20  TER_DBMOD" :.   
ad10: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ad20: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
ad30: 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f  ISHED ? "WRITER_
ad40: 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20  FINISHED" :.    
ad50: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
ad60: 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20  AGER_ERROR      
ad70: 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a       ? "ERROR" :
ad80: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
ad90: 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f   , (int)p->errCo
ada0: 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c  de.      , p->eL
adb0: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20  ock==NO_LOCK    
adc0: 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22       ? "NO_LOCK"
add0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
ade0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
adf0: 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44  CK   ? "RESERVED
ae00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ae10: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
ae20: 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49  LOCK  ? "EXCLUSI
ae30: 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  VE" :.        p-
ae40: 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
ae50: 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45  OCK     ? "SHARE
ae60: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ae70: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
ae80: 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57  OCK    ? "UNKNOW
ae90: 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  N" : "?error?". 
aea0: 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73       , p->exclus
aeb0: 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75  iveMode ? "exclu
aec0: 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22  sive" : "normal"
aed0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
aee0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aef0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
af00: 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a  Y   ? "memory" :
af10: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
af20: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
af30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
af40: 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20      ? "off" :.  
af50: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
af60: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
af70: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
af80: 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20   ? "delete" :.  
af90: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
afa0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
afb0: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
afc0: 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20   ? "persist" :. 
afd0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
afe0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aff0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
b000: 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a  E ? "truncate" :
b010: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
b020: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
b030: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
b040: 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f      ? "wal" : "?
b050: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b060: 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65  (int)p->tempFile
b070: 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c  , (int)p->memDb,
b080: 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72   (int)p->useJour
b090: 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  nal.      , p->j
b0a0: 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f  ournalOff, p->jo
b0b0: 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c  urnalHdr.      ,
b0c0: 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c   (int)p->dbSize,
b0d0: 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53   (int)p->dbOrigS
b0e0: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46  ize, (int)p->dbF
b0f0: 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20  ileSize.  );..  
b100: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
b110: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
b120: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
b130: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
b140: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
b150: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
b160: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
b170: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
b180: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
b190: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
b1a0: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
b1b0: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
b1c0: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
b1d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
b1e0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
b1f0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
b200: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
b210: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
b220: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
b230: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
b240: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
b250: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
b260: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
b270: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
b280: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
b290: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
b2a0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
b2b0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
b2c0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61  Pg->pPager;.  Pa
b2d0: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b  gerSavepoint *p;
b2e0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
b2f0: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  Pg->pgno;.  int 
b300: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
b310: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
b320: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  nt; i++){.    p 
b330: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
b340: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
b350: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
b360: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
b370: 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28  tvecTestNotNull(
b380: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
b390: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
b3a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
b3b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
b3c0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
b3d0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
b3e0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
b3f0: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
b400: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
b410: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
b420: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
b430: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b440: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
b450: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
b460: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
b470: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
b480: 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66  >pgno);.}.#endif
b490: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
b4a0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
b4b0: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
b4c0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
b4d0: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
b4e0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
b4f0: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
b500: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
b510: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
b520: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
b530: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b540: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b550: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
b560: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
b570: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
b580: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b590: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
b5a0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b5b0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
b5c0: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
b5d0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
b5e0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
b5f0: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
b600: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
b610: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
b620: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
b630: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
b640: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
b650: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b660: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b670: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b680: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
b690: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
b6a0: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
b6b0: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
b6c0: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
b6d0: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
b6e0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b6f0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
b700: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
b710: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b720: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
b730: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
b740: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
b750: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b760: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
b770: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
b780: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b790: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b7a0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
b7b0: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
b7c0: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
b7d0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
b7e0: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
b7f0: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
b800: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
b810: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
b820: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
b830: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
b840: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
b850: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
b860: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
b870: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
b880: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
b890: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
b8a0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
b8b0: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
b8c0: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
b8d0: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
b8e0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
b8f0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
b900: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
b910: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
b920: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
b930: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
b940: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
b950: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
b960: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
b970: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
b980: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
b990: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
b9a0: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
b9b0: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
b9c0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
b9d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b9e0: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
b9f0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
ba00: 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
ba10: 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock==eLock );.
ba20: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
ba30: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  =NO_LOCK || eLoc
ba40: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
ba50: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
ba60: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61  k!=NO_LOCK || pa
ba70: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
ba80: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  )==0 );.  if( is
ba90: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
baa0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bab0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65  pPager->eLock>=e
bac0: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d  Lock );.    rc =
bad0: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
bae0: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
baf0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
bb00: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
bb10: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
bb20: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
bb30: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
bb40: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
bb50: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
bb60: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
bb70: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bb80: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
bb90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
bbb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
bbc0: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
bbd0: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
bbe0: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
bbf0: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
bc00: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
bc10: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
bc20: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
bc30: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
bc40: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
bc50: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
bc60: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
bc70: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
bc80: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
bc90: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
bca0: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
bcb0: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
bcc0: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
bcd0: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
bce0: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
bcf0: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
bd00: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
bd10: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
bd20: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
bd30: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
bd40: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
bd50: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
bd60: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
bd70: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
bd80: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
bd90: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
bda0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
bdb0: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
bdc0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
bdd0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
bde0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
bdf0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
be00: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
be10: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
be20: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
be30: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
be40: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
be50: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
be60: 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
be70: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
be80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
be90: 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c  K && (pPager->eL
bea0: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
beb0: 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  K||eLock==EXCLUS
bec0: 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  IVE_LOCK) ){.   
bed0: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
bee0: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
bef0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
bf00: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
bf10: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20  ger, eLock)).   
bf20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bf30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
bf40: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
bf50: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
bf60: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
bf70: 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
bf80: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  on.** can be use
bf90: 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  d with this page
bfa0: 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  r. The optimizat
bfb0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
bfc0: 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74  if:.**.**  (a) t
bfd0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
bfe0: 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61  d by OsDeviceCha
bff0: 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69  racteristics() i
c000: 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a  ndicates that.**
c010: 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65        a database
c020: 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69   page may be wri
c030: 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c  tten atomically,
c040: 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65   and.**  (b) the
c050: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c060: 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  by OsSectorSize(
c070: 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  ) is less than o
c080: 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20  r equal.**      
c090: 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  to the page size
c0a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69  ..**.** The opti
c0b0: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f  mization is also
c0c0: 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20   always enabled 
c0d0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
c0e0: 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e  les. It is.** an
c0f0: 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74   error to call t
c100: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  his function if 
c110: 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64  pPager is opened
c120: 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   on an in-memory
c130: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  .** database..**
c140: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
c150: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
c160: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
c170: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
c180: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
c190: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
c1a0: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
c1b0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c1c0: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
c1d0: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
c1e0: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
c1f0: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
c200: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c210: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
c220: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
c230: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
c240: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
c250: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
c260: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
c270: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
c280: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
c2b0: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
c2c0: 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20    int nSector;  
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2e0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
c2f0: 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ze */.    int sz
c300: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
c310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c320: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20  age size */..   
c330: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
c340: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
c350: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
c360: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
c370: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
c380: 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20  d);.    nSector 
c390: 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  = pPager->sector
c3a0: 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65  Size;.    szPage
c3b0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
c3c0: 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ize;..    assert
c3d0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c3e0: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
c3f0: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53  ));.    assert(S
c400: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
c410: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
c420: 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  ));.    if( 0==(
c430: 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  dc&(SQLITE_IOCAP
c440: 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e  _ATOMIC|(szPage>
c450: 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e  >8)) || nSector>
c460: 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  szPage) ){.     
c470: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
c480: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a  .  }..  return J
c490: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
c4a0: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
c4b0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d  PG_SZ(pPager);.}
c4c0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
c4d0: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 78  jrnlBufferSize(x
c4e0: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
c4f0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
c500: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
c510: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
c520: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
c530: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
c540: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
c550: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
c560: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
c570: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
c580: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
c590: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
c5a0: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
c5b0: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
c5c0: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
c5d0: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
c5e0: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
c5f0: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
c600: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
c610: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
c620: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
c630: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
c640: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
c650: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
c660: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
c670: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
c680: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
c690: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
c6a0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
c6b0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
c6c0: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
c6d0: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
c6e0: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
c6f0: 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61  r *)pPage->pData
c700: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
c710: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
c720: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c730: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65  ){.  pPage->page
c740: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
c750: 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a  ehash(pPage);.}.
c760: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
c770: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
c780: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
c790: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
c7a0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c7b0: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
c7c0: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
c7d0: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
c7e0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
c7f0: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
c800: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
c810: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
c820: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
c830: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
c840: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
c850: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
c860: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
c870: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
c880: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
c890: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
c8a0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
c8b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
c8c0: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
c8d0: 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  R );.  assert( (
c8e0: 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
c8f0: 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e  _DIRTY) || pPg->
c900: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
c910: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
c920: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
c930: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
c940: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
c950: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c960: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  X)  0.#define pa
c970: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
c980: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43  (X).#define CHEC
c990: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
c9a0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
c9b0: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
c9c0: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
c9d0: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
c9e0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
c9f0: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
ca00: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75  open..** This fu
ca10: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
ca20: 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72  to read a master
ca30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
ca40: 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  me from the .** 
ca50: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
ca60: 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66  and, if successf
ca70: 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e  ul, copies it in
ca80: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
ca90: 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ed .** by the ca
caa0: 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  ller. See commen
cab0: 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61  ts above writeMa
cac0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
cad0: 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  r the format.** 
cae0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
caf0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cb00: 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20  ile name at the 
cb10: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
cb20: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61   file..**.** zMa
cb30: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
cb40: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
cb50: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
cb60: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
cb70: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
cb80: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
cb90: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
cba0: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
cbb0: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
cbc0: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
cbd0: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
cbe0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
cbf0: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
cc00: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
cc10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
cc20: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
cc30: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
cc40: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
cc50: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
cc60: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
cc70: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
cc80: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
cc90: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
cca0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
ccb0: 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20  .** If a master 
ccc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
ccd0: 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20  e is present at 
cce0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
ccf0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20  ournal.** file, 
cd00: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
cd10: 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  d into the buffe
cd20: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
cd30: 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75  zMaster. A.** nu
cd40: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
cd50: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
cd60: 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c   the buffer foll
cd70: 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  owing the master
cd80: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
cd90: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
cda0: 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
cdb0: 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20   that no master 
cdc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
cdd0: 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a  e is present .**
cde0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
cdf0: 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
ce00: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
ce10: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
ce20: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
ce30: 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
ce40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e  journal file, an
ce50: 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72   SQLite.** error
ce60: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
ce70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
ce80: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
ce90: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
cea0: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
ceb0: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
cec0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
cef0: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79   /* Length in by
cf20: 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  tes of master jo
cf30: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
cf40: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
cf50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
cf60: 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tal size in byte
cf70: 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s of journal fil
cf80: 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32  e pJrnl */.  u32
cf90: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
cfa0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68          /* MJ ch
cfb0: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61  ecksum value rea
cfc0: 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
cfd0: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cff0: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
d000: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
d010: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
d020: 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66  c[8];   /* A buf
d030: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
d040: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
d050: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
d060: 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  \0';..  if( SQLI
d070: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d080: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
d090: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20  Jrnl, &szJ)).   
d0a0: 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20  || szJ<16.   || 
d0b0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d0c0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
d0d0: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
d0e0: 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61  ).   || len>=nMa
d0f0: 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d  ster .   || len=
d100: 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  =0 .   || SQLITE
d110: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
d120: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
d130: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
d140: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d150: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
d160: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
d170: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
d180: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
d190: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
d1a0: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
d1b0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d1c0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
d1d0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
d1e0: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
d1f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
d200: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
d210: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
d220: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
d230: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
d240: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
d250: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
d260: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
d270: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
d280: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
d290: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
d2a0: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
d2b0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
d2c0: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
d2d0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
d2e0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
d2f0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
d300: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
d310: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
d320: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
d330: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
d340: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
d350: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
d360: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
d370: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
d380: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
d390: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
d3a0: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
d3b0: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
d3c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
d3d0: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
d3e0: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
d3f0: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
d400: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
d410: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
d420: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
d430: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
d440: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
d450: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
d460: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
d470: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
d480: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
d490: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
d4a0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
d4b0: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
d4c0: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
d4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4f0: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d510: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
d560: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d570: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
d580: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
d590: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
d5a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
d5b0: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
d5c0: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
d5d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
d5e0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
d5f0: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
d600: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d610: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
d620: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d630: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
d640: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
d650: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d660: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
d670: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
d680: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
d690: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
d6a0: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
d6b0: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
d6c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
d6d0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
d6e0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
d6f0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d700: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
d710: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
d720: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
d730: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
d740: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
d750: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
d760: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
d770: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
d780: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
d790: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
d7a0: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
d7b0: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
d7c0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
d7d0: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
d7e0: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
d7f0: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
d800: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
d810: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
d820: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
d830: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
d840: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
d850: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d860: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
d870: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
d880: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
d890: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
d8a0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
d8b0: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
d8c0: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
d8d0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
d8e0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
d8f0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d900: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
d910: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
d920: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
d930: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
d940: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
d950: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
d960: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
d970: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
d980: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
d990: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
d9a0: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
d9b0: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
d9c0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
d9d0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d9e0: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
d9f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
da00: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
da10: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
da20: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
da30: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
da40: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
da50: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
da60: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
da70: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
da80: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
da90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
daa0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
dab0: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
dac0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
dad0: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
dae0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
daf0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db10: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
db20: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
db30: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
db40: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
db50: 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c   !sqlite3Journal
db60: 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65  IsInMemory(pPage
db70: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
db80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
db90: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
dba0: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
dbb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
dbc0: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
dbd0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
dbe0: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
dbf0: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
dc00: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
dc10: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
dc20: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
dc30: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dc40: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dc50: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
dc60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
dc70: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
dc80: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
dc90: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
dca0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
dcb0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
dcc0: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
dcd0: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
dce0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dcf0: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dd00: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dd10: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dd20: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dd30: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dd40: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
dd50: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
dd60: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
dd70: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dd80: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
dd90: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
dda0: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
ddb0: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
ddc0: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
ddd0: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
dde0: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
ddf0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
de00: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
de10: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
de20: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
de30: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
de40: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
de50: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
de60: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
de70: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
de80: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
de90: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
dea0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
deb0: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
dec0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ded0: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
dee0: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
def0: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
df00: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
df10: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
df20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
df30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
df40: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
df50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
df60: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
df70: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
df80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
df90: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
dfa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
dfb0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
dfc0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
dfd0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
dfe0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
dff0: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
e000: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
e010: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e020: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
e030: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
e040: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
e050: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
e060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
e070: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
e080: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
e090: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
e0a0: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
e0b0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e0c0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
e0d0: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
e0e0: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
e0f0: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
e100: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
e110: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
e120: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
e130: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
e140: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e150: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e160: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e170: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e180: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e190: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e1a0: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e1b0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e1c0: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e1d0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e1e0: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e1f0: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e200: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e210: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e220: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e230: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e260: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e270: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e280: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e290: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e2a0: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e2b0: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e2c0: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e2d0: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e2e0: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e2f0: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e300: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e330: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e340: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e350: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e380: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e390: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e3a0: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e3b0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e3c0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e3d0: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e3e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e3f0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e400: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e410: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e420: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e430: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e440: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e450: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e460: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e470: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e480: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e490: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e4a0: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e4b0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e4c0: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e4d0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e4e0: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e4f0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e500: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e510: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e520: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e530: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e540: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e550: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e560: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e570: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e580: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e590: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e5a0: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e5b0: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e5c0: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e5d0: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e5e0: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e5f0: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e600: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e610: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e620: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e630: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e640: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e650: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e660: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e670: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e680: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e690: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e6a0: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e6b0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e6c0: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e6d0: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e6e0: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e6f0: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e700: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e710: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e720: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e730: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e740: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e750: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e760: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e770: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e780: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e790: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e7a0: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e7b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e7c0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e7d0: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e7e0: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e7f0: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e800: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e810: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e820: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e830: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e840: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e850: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e860: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e870: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e880: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e890: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e8a0: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e8b0: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e8c0: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e8d0: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e8e0: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e8f0: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e900: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e910: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e920: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e930: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e940: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e950: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e960: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e970: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e980: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e990: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e9a0: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
e9b0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e9c0: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
e9d0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
e9e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
e9f0: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
ea00: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ea10: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
ea20: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
ea30: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
ea40: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
ea50: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
ea60: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
ea70: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
ea80: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
ea90: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
eaa0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
eab0: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
eac0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ead0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
eae0: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
eaf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
eb00: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
eb10: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
eb20: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
eb30: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
eb40: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
eb50: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
eb60: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
eb70: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
eb80: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
eb90: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
eba0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ebb0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ebc0: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
ebd0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
ebe0: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
ebf0: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
ec00: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
ec10: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ec20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
ec30: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
ec40: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
ec50: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
ec60: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
ec70: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
ec80: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ec90: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eca0: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
ecb0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
ecc0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
ecd0: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
ece0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ecf0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ed00: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ed10: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ed20: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ed30: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
ed40: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
ed50: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
ed60: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
ed70: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ed80: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
ed90: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
eda0: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
edb0: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
edc0: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
edd0: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
ede0: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
edf0: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ee00: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ee10: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ee20: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ee30: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
ee40: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
ee50: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
ee60: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
ee70: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
ee80: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
ee90: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
eea0: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
eeb0: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
eec0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
eed0: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
eee0: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
eef0: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
ef00: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
ef10: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
ef20: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ef30: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
ef40: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
ef50: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
ef60: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
ef70: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
ef80: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
ef90: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
efa0: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
efb0: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
efc0: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
efd0: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
efe0: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
eff0: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
f000: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
f010: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
f020: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
f030: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
f040: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
f050: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
f060: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
f070: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
f080: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f090: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
f0a0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f0b0: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
f0c0: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
f0d0: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
f0e0: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
f0f0: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
f100: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
f110: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
f120: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
f130: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
f140: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f150: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f160: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f170: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f180: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f190: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f1a0: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f1b0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f1c0: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f1d0: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f1e0: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f1f0: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f200: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f210: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f220: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f230: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f240: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f250: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f260: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f270: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f280: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f290: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f2a0: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f2b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f2c0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f2d0: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f2e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f2f0: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f300: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f310: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f320: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f330: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f340: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f350: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f360: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f370: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f380: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f390: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f3a0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f3b0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f3c0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f3d0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f3e0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f3f0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f400: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f410: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f430: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f440: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f450: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f460: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f470: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f480: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f490: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f4a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f4b0: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f4c0: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f4d0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f4e0: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f4f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f500: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f510: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f520: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f530: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f540: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f550: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f560: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f570: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f580: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f590: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f5a0: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f5b0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f5c0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f5d0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f5e0: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f5f0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f600: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f610: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f620: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f630: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f640: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f650: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f660: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f670: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f680: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f690: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f6a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f6b0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f6c0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f6d0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f6e0: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f6f0: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f700: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f710: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f720: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f730: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f740: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f750: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f760: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f770: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f780: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f790: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f7a0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f7b0: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f7c0: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f7e0: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f7f0: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f800: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f810: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f830: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f840: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f850: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f860: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f870: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f880: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f890: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f8a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f8b0: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f8c0: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f8d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f8e0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f8f0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f900: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f910: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f920: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f930: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f940: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f950: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f960: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f970: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f980: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f990: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
f9a0: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
f9b0: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
f9c0: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
f9d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f9e0: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
f9f0: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
fa00: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
fa10: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
fa20: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
fa30: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
fa40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fa50: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
fa60: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
fa70: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
fa80: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
fa90: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
faa0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fab0: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
fac0: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
fad0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
fae0: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
faf0: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
fb00: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
fb10: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
fb20: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
fb30: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
fb40: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fb50: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fb60: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fb70: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fb80: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
fb90: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fba0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fbb0: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fbc0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fbd0: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fbe0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
fbf0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fc00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fc10: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fc20: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fc30: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
fc40: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fc50: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fc60: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fc70: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fc80: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fc90: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fca0: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fcb0: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fcc0: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fcd0: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fce0: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fcf0: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fd00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fd10: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fd20: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fd30: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fd40: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fd50: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fd60: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fd70: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fd80: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fd90: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fda0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fdb0: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fdc0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fdd0: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fde0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fdf0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fe00: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fe10: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fe20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fe30: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fe40: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
fe50: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fe60: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fe70: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fe80: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fe90: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
fea0: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
feb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
fec0: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
fed0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fee0: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
fef0: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
ff00: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
ff10: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
ff20: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
ff30: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
ff40: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
ff50: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
ff60: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
ff70: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
ff80: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
ff90: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ffa0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
ffb0: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
ffc0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
ffd0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
ffe0: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
fff0: 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
10000 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
10010 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
10020 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
10030 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
10040 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
10050 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
10060 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
10070 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
10080 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
10090 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
100a0 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
100b0 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
100c0 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
100d0 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
100e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
100f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10100 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
10110 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10120 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10130 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
10140 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
10150 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
10160 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
10170 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
10180 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
10190 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
101a0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
101b0 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
101c0 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
101d0 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
101e0 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
101f0 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10200 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10210 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10220 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10230 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
10240 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
10250 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
10260 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10270 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
10280 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
10290 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
102a0 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
102b0 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
102c0 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
102d0 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
102e0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
102f0 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10300 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10310 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10320 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10330 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
10340 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
10350 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
10360 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10370 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
10380 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
10390 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
103a0 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
103b0 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
103c0 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
103d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
103e0 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
103f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10400 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10410 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10420 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10430 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
10440 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
10450 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
10460 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
10470 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
10480 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
10490 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
104a0 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
104b0 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
104c0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
104d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
104e0 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
104f0 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10500 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10510 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10520 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10530 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
10540 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
10550 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
10560 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
10570 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
10580 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
10590 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
105a0 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
105b0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
105c0 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
105d0 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
105e0 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
105f0 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10600 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10610 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10620 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10630 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
10640 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
10650 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
10660 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
10670 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
10680 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
10690 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
106a0 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
106b0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
106c0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
106d0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
106e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
106f0 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
10700 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10710 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
10720 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
10730 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
10740 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
10750 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
10760 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
10770 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
10780 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
10790 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
107a0 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
107b0 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
107c0 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
107d0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
107e0 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
107f0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
10800 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
10810 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
10820 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
10830 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
10840 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
10850 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
10860 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
10870 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10880 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
10890 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
108a0 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
108b0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
108c0 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
108d0 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
108e0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
108f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10900 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
10910 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
10920 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
10930 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
10940 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
10950 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
10960 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
10970 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
10980 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
10990 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
109a0 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
109b0 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
109c0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
109d0 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
109e0 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
109f0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
10a00 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
10a10 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
10a20 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
10a30 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
10a40 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
10a50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
10a60 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
10a70 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10aa0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10ab0 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10ad0 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10ae0 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
10af0 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b10 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
10b20 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
10b30 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
10b40 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10b50 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10b60 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10b70 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10b80 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ba0 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10bb0 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10bc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10bd0 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10be0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10bf0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10c00 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10c10 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10c20 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10c30 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10c40 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10c50 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10c60 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10c70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10c80 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10c90 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10ca0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10cb0 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10cc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10cd0 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10ce0 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10cf0 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10d00 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10d10 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10d20 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10d30 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10d40 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10d50 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10d60 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10d70 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10d80 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10d90 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10da0 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10db0 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10dc0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10dd0 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10de0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10df0 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10e00 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10e10 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10e20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10e30 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10e40 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10e50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10e60 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10e70 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10e80 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10e90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10ea0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10eb0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10ec0 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10ed0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10ee0 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10ef0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10f00 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10f10 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10f20 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10f30 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10f40 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10f50 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10f60 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10f70 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10f80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10f90 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10fa0 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10fb0 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10fc0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10fd0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10fe0 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10ff0 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
11000 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
11010 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
11020 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
11030 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
11040 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
11050 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11060 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
11070 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
11080 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
11090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
110c0 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
110d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
110e0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
110f0 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
11100 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
11110 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11120 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11130 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
11140 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
11150 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
11160 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
11170 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
11180 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
11190 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
111a0 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
111b0 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
111c0 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
111d0 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
111e0 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
111f0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11200 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11210 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11220 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11230 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
11240 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
11250 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
11260 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
11270 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
11280 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
11290 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
112a0 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
112b0 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
112c0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
112d0 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
112e0 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
112f0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11300 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11310 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11320 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11330 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
11340 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11350 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
11360 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
11370 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
11380 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11390 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
113a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
113b0 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
113c0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
113d0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
113e0 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
113f0 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11400 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11410 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11420 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11430 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
11440 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
11450 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
11460 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
11470 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
11480 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11490 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
114a0 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
114b0 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
114c0 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
114d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
114e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
114f0 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29  ate>PAGER_OPEN )
11500 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11510 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 3b  r->iDataVersion;
11520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11530 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
11540 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
11550 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
11560 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
11570 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
11580 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
11590 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
115a0 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
115b0 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
115c0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
115d0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
115e0 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
115f0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11600 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11610 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11620 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11630 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
11640 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
11650 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
11660 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
11670 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
11680 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
11690 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
116a0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
116b0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
116c0 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
116d0 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
116e0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
116f0 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
11700 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
11710 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  y(pPager->sjfd) 
11720 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
11730 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a  Close(pPager->sj
11740 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
11750 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
11760 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70  aSavepoint);.  p
11770 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11780 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
11790 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
117a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  .  pPager->nSubR
117b0 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ec = 0;.}../*.**
117c0 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d   Set the bit num
117d0 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ber pgno in the 
117e0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
117f0 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  InSavepoint .** 
11800 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f  bitvecs of all o
11810 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
11820 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
11830 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a   if successful.*
11840 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
11850 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
11860 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f  ilure occurs..*/
11870 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54  .static int addT
11880 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
11890 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  s(Pager *pPager,
118a0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
118b0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
118c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
118d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
118e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
118f0 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
11900 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72  t code */..  for
11910 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
11920 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
11930 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
11940 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
11950 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11960 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67  [ii];.    if( pg
11970 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a  no<=p->nOrig ){.
11980 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69        rc |= sqli
11990 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e  te3BitvecSet(p->
119a0 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
119b0 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  no);.      testc
119c0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
119d0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61  NOMEM );.      a
119e0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
119f0 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
11a00 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
11a10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
11a20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
11a30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11a40 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
11a50 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11a60 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a  e mode and not.*
11a70 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  * in the ERROR s
11a80 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
11a90 20 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65   it switches the
11aa0 20 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f   pager to PAGER_
11ab0 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a  OPEN.** state..*
11ac0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
11ad0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11ae0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
11af0 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
11b00 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c  file is.** compl
11b10 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  etely unlocked. 
11b20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
11b30 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  nlocked and the 
11b40 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73  file-system does
11b50 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20  .** not exhibit 
11b60 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f  the UNDELETABLE_
11b70 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72  WHEN_OPEN proper
11b80 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ty, the journal 
11b90 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  file is.** close
11ba0 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e  d (if it is open
11bb0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
11bc0 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f  pager is in ERRO
11bd0 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  R state when thi
11be0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
11bf0 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f  lled, the .** co
11c00 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
11c10 67 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69  ger cache are di
11c20 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73  scarded before s
11c30 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f  witching back to
11c40 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74   .** the OPEN st
11c50 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ate. Regardless 
11c60 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70  of whether the p
11c70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
11c80 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20  sive-mode.** or 
11c90 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c  not, any journal
11ca0 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68   file left in th
11cb0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69  e file-system wi
11cc0 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a  ll be treated.**
11cd0 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
11ce0 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
11cf0 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  k the next time 
11d00 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
11d10 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20  on.** is opened 
11d20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61  (by this or by a
11d30 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ny other connect
11d40 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ion)..*/.static 
11d50 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
11d60 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
11d70 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
11d80 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11d90 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20  ER_READER .     
11da0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
11db0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
11dc0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11dd0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11de0 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20  _ERROR .  );..  
11df0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
11e00 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
11e10 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
11e20 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
11e30 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c   0;.  releaseAll
11e40 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
11e50 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72  r);..  if( pager
11e60 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
11e70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
11e80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
11e90 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  d) );.    sqlite
11ea0 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
11eb0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
11ec0 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Wal);.    pPager
11ed0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
11ee0 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  _OPEN;.  }else i
11ef0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11f00 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
11f10 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f30 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74  * Error code ret
11f40 75 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e  urned by pagerUn
11f50 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20  lockDb() */.    
11f60 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e  int iDc = isOpen
11f70 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c  (pPager->fd)?sql
11f80 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
11f90 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
11fa0 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20  er->fd):0;..    
11fb0 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  /* If the operat
11fc0 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
11fd0 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f  rt deletion of o
11fe0 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a  pen files, then.
11ff0 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65      ** close the
12000 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
12010 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
12020 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20  database lock.  
12030 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
12040 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
12050 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
12060 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
12070 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ht delete the fi
12080 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72  le.    ** out fr
12090 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
120a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
120b0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
120c0 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29  DE_MEMORY   & 5)
120d0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
120e0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
120f0 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26  LMODE_OFF      &
12100 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12110 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12120 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
12130 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12140 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12150 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
12160 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  TE   & 5)!=1 );.
12170 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12180 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
12190 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20  RUNCATE & 5)==1 
121a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
121b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
121c0 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d  E_PERSIST  & 5)=
121d0 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =1 );.    if( 0=
121e0 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49  =(iDc & SQLITE_I
121f0 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
12200 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20  _WHEN_OPEN).    
12210 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e   || 1!=(pPager->
12220 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29  journalMode & 5)
12230 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
12240 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
12250 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
12260 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
12270 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
12280 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
12290 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f  the call to unlo
122a0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
122b0 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c      ** file fail
122c0 73 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65  s, set the curre
122d0 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f  nt lock to UNKNO
122e0 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65  WN_LOCK. See the
122f0 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20   comment.    ** 
12300 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
12310 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  e for UNKNOWN_LO
12320 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
12330 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69  ation of why thi
12340 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65  s.    ** is nece
12350 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
12360 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f    rc = pagerUnlo
12370 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f  ckDb(pPager, NO_
12380 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
12390 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
123a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
123b0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20  PAGER_ERROR ){. 
123c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
123d0 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ck = UNKNOWN_LOC
123e0 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
123f0 20 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65   The pager state
12400 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20   may be changed 
12410 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52  from PAGER_ERROR
12420 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68   to PAGER_OPEN h
12430 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f  ere.    ** witho
12440 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  ut clearing the 
12450 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73  error code. This
12460 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20   is intentional 
12470 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  - the error.    
12480 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72  ** code is clear
12490 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
124a0 20 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c   reset in the bl
124b0 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  ock below..    *
124c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
124d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
124e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
124f0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
12500 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12510 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
12520 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12530 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
12540 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50  ;.  }..  /* If P
12550 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20  ager.errCode is 
12560 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  set, the content
12570 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
12580 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20  ache cannot be. 
12590 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
125a0 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
125b0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
125c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
125d0 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20   pager,.  ** it 
125e0 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20  can safely move 
125f0 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50  back to PAGER_OP
12600 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68  EN state. This h
12610 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20  appens in both. 
12620 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65   ** normal and e
12630 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
12640 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   mode..  */.  if
12650 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
12660 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
12670 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
12680 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
12690 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
126a0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
126b0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
126c0 6c 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  le;.    pPager->
126d0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
126e0 50 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  PEN;.    pPager-
126f0 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
12700 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 55 53  E_OK;.    if( US
12710 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
12720 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
12730 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c  h(pPager->fd, 0,
12740 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67   0);.  }..  pPag
12750 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
12760 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
12770 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
12780 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
12790 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
127a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
127b0 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
127c0 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c   an IOERR or FUL
127d0 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71  L error that req
127e0 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67  uires.** the pag
127f0 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  er to transition
12800 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
12810 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f  state may ahve o
12820 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ccurred..** The 
12830 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
12840 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
12850 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
12860 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a  re, the second .
12870 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  ** the error-cod
12880 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
12890 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
128a0 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
128b0 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  The .** value re
128c0 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
128d0 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
128e0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
128f0 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
12900 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
12910 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
12920 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
12930 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
12940 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d  he.** IOERR sub-
12950 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72  codes, the pager
12960 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f   enters the ERRO
12970 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12980 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
12990 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
129a0 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20  .errCode. While 
129b0 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e  the pager remain
129c0 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
129d0 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a  tate,.** all maj
129e0 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  or API calls on 
129f0 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69  the Pager will i
12a00 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
12a10 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
12a20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52  .**.** The ERROR
12a30 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73   state indicates
12a40 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
12a50 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
12a60 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
12a70 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
12a80 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
12a90 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
12aa0 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
12ab0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
12ac0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
12ad0 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
12ae0 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
12af0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
12b00 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
12b10 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
12b20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
12b30 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
12b40 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
12b50 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
12b60 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
12b70 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
12b80 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
12b90 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
12ba0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12bb0 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
12bc0 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
12bd0 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
12be0 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
12bf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
12c00 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
12c10 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
12c20 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
12c30 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
12c40 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12c50 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
12c60 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
12c70 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
12c80 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
12c90 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
12ca0 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
12cb0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
12cc0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
12cd0 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
12ce0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12cf0 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20   PAGER_ERROR;.  
12d00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12d10 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
12d20 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
12d30 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
12d40 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  nPage);../*.** T
12d50 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73  his routine ends
12d60 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
12d70 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
12d80 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62   usually ended b
12d90 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43  y .** either a C
12da0 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
12db0 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  ACK operation. T
12dc0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
12dd0 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66  be called .** af
12de0 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  ter rollback of 
12df0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f  a hot-journal, o
12e00 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
12e10 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
12e20 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ng.** the journa
12e30 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e  l file or writin
12e40 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  g the very first
12e50 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
12e60 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65  of a.** database
12e70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
12e80 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
12e90 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
12ea0 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
12eb0 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73   state. If it is
12ec0 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41   called.** in PA
12ed0 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45  GER_NONE or PAGE
12ee0 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61  R_SHARED state a
12ef0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64  nd the lock held
12f00 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c   is less.** excl
12f10 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53  usive than a RES
12f20 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69  ERVED lock, it i
12f30 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
12f40 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20   Otherwise, any 
12f50 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
12f60 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a  s are released..
12f70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
12f80 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
12f90 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66  n, then it is "f
12fa0 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20  inalized". Once 
12fb0 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69  a journal .** fi
12fc0 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  le has been fina
12fd0 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20  lized it is not 
12fe0 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
12ff0 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  it to roll back 
13000 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  a .** transactio
13010 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62  n. Nor will it b
13020 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
13030 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
13040 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61   by this.** or a
13050 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ny other databas
13060 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78  e connection. Ex
13070 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72  actly how a jour
13080 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
13090 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  .** depends on w
130a0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
130b0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
130c0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
130d0 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  mode and.** the 
130e0 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d  current journal-
130f0 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72  mode (Pager.jour
13100 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20  nalMode value), 
13110 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
13120 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
13130 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a  =MEMORY.**     J
13140 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
13150 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79  riptor is simply
13160 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65   closed. This de
13170 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20  stroys an .**   
13180 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72    in-memory jour
13190 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  nal..**.**   jou
131a0 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41  rnalMode==TRUNCA
131b0 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  TE.**     Journa
131c0 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  l file is trunca
131d0 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ted to zero byte
131e0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
131f0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13200 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54  PERSIST.**     T
13210 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65  he first 28 byte
13220 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
13230 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64   file are zeroed
13240 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74  . This invalidat
13250 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69  es.**     the fi
13260 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
13270 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20  er in the file, 
13280 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e  and hence the en
13290 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  tire journal.** 
132a0 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76      file. An inv
132b0 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
132c0 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  e cannot be roll
132d0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
132e0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45   journalMode==DE
132f0 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20  LETE.**     The 
13300 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
13310 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
13320 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
13330 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
13340 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67  *     If the pag
13350 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13360 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
13370 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20   this method of 
13380 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20  finalizing.**   
13390 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
133a0 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  le is never used
133b0 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68  . Instead, if th
133c0 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  e journalMode is
133d0 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61  .**     DELETE a
133e0 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
133f0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13400 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  e, the method de
13410 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a  scribed under.**
13420 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65       journalMode
13430 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65  ==PERSIST is use
13440 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
13450 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
13460 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c  al is finalized,
13470 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   the pager moves
13480 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
13490 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75   state..** If ru
134a0 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63  nning in non-exc
134b0 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20  lusive rollback 
134c0 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f  mode, the lock o
134d0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a  n the file is .*
134e0 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
134f0 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  a SHARED_LOCK..*
13500 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
13510 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
13520 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
13530 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
13540 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
13550 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
13560 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
13570 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13580 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
13590 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
135a0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
135b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
135c0 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
135d0 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
135e0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
135f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
13600 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
13610 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
13620 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
13630 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
13640 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
13650 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
13660 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
13670 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
13680 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
13690 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
136a0 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
136b0 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
136c0 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
136d0 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
136e0 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
136f0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
13700 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
13710 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
13720 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
13730 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d  aster, int bComm
13740 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  it){.  int rc = 
13750 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
13760 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13770 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
13780 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
13790 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
137a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
137b0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
137c0 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
137d0 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
137e0 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
137f0 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  if the pager doe
13800 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70  s not have an op
13810 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
13820 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20  tion.  ** or at 
13830 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
13840 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63   lock. This func
13850 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
13860 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20  ed when there.  
13870 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  ** is no write-t
13880 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
13890 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44  e but a RESERVED
138a0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
138b0 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e   is.  ** held un
138c0 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74  der two circumst
138d0 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ances:.  **.  **
138e0 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75     1. After a su
138f0 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75  ccessful hot-jou
13900 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
13910 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  t is called with
13920 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74  .  **      eStat
13930 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e  e==PAGER_NONE an
13940 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
13950 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20  VE_LOCK..  **.  
13960 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e  **   2. If a con
13970 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63  nection with loc
13980 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
13990 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ive holding an E
139a0 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20  XCLUSIVE .  **  
139b0 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65      lock switche
139c0 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e  s back to lockin
139d0 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e  g_mode=normal an
139e0 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20  d then executes 
139f0 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64  a.  **      read
13a00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68  -transaction, th
13a10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13a20 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74  alled with eStat
13a30 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
13a40 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65  .  **      and e
13a50 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13a60 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65  LOCK when the re
13a70 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
13a80 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20  s closed..  */. 
13a90 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
13aa0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
13ab0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
13ac0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
13ad0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
13ae0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
13af0 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45  tate<PAGER_WRITE
13b00 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67  R_LOCKED && pPag
13b10 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56  er->eLock<RESERV
13b20 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
13b30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13b40 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41  .  }..  releaseA
13b50 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
13b60 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
13b70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13b80 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
13b90 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
13ba0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
13bb0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13bc0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
13bd0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
13be0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
13bf0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13c00 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
13c10 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
13c20 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
13c30 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  jfd) ){.      /*
13c40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13c50 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13c60 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13c70 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20 20  MEMORY ); */.   
13c80 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13c90 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
13ca0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13cb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13cc0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13cd0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
13ce0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
13cf0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
13d00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13d10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13d20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13d30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
13d40 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
13d50 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
13d60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13d70 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
13d80 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
13d90 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
13da0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69   the new file si
13db0 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ze is written in
13dc0 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67  to the inode rig
13dd0 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20  ht away..       
13de0 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20     ** Otherwise 
13df0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
13e00 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c  t resurrect foll
13e10 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f  owing a power lo
13e20 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ss and.         
13e30 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61   ** cause the la
13e40 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  st transaction t
13e50 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65  o roll back.  Se
13e60 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  e.          ** h
13e70 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e  ttps://bugzilla.
13e80 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77  mozilla.org/show
13e90 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32  _bug.cgi?id=1072
13ea0 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  773.          */
13eb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13ec0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
13ed0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
13ee0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
13ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13f00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13f10 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13f20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13f30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13f40 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13f50 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
13f60 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
13f70 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
13f80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13f90 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
13fa0 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29  LMODE_WAL).    )
13fb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
13fc0 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
13fd0 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
13fe0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13ff0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
14000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
14010 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61  * This branch ma
14020 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69  y be executed wi
14030 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  th Pager.journal
14040 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a  Mode==MEMORY if.
14050 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a        ** a hot-j
14060 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20  ournal was just 
14070 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20  rolled back. In 
14080 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
14090 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66  urnal.      ** f
140a0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ile should be cl
140b0 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
140c0 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  . If this connec
140d0 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20  tion writes to. 
140e0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
140f0 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69  base file, it wi
14100 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61  ll do so using a
14110 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
14120 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nal..      */.  
14130 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65 20      int bDelete 
14140 3d 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  = !pPager->tempF
14150 69 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ile;.      asser
14160 74 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  t( sqlite3Journa
14170 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67  lIsInMemory(pPag
14180 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29 3b 0a 20  er->jfd)==0 );. 
14190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
141a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
141b0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
141c0 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20  ODE_DELETE .    
141d0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
141e0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
141f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14200 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20  _MEMORY .       
14210 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
14220 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
14230 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
14240 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
14250 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
14260 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
14270 20 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65       if( bDelete
14280 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14290 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
142a0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
142b0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
142c0 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
142d0 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
142e0 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
142f0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
14300 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  S.  sqlite3Pcach
14310 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
14320 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
14330 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
14340 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
14350 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73  ->dbSize==0 && s
14360 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
14370 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
14380 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50  ache)>0 ){.    P
14390 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  gHdr *p = sqlite
143a0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
143b0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ger, 1);.    if(
143c0 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70   p ){.      p->p
143d0 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20  ageHash = 0;.   
143e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
143f0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a  nrefNotNull(p);.
14400 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
14410 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
14420 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
14430 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
14440 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
14450 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  al = 0;.  pPager
14460 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
14470 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
14480 6c 65 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29  le==0 || MEMDB )
14490 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
144a0 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
144b0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
144c0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
144d0 65 33 50 63 61 63 68 65 43 6c 65 61 72 57 72 69  e3PcacheClearWri
144e0 74 61 62 6c 65 28 70 50 61 67 65 72 2d 3e 70 50  table(pPager->pP
144f0 43 61 63 68 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Cache);.  }.  sq
14500 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
14510 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
14520 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
14530 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
14540 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14550 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
14560 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
14570 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
14580 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
14590 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
145a0 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
145b0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
145c0 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
145d0 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
145e0 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
145f0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
14600 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
14610 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
14620 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
14630 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
14640 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
14650 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
14660 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
14670 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14680 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
14690 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
146a0 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
146b0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
146c0 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
146d0 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
146e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
146f0 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
14700 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
14710 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14720 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
14730 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
14740 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
14750 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
14760 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
14770 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
14780 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
14790 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
147a0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
147b0 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
147c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
147d0 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
147e0 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
147f0 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
14800 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
14810 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
14820 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
14830 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
14840 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
14850 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
14860 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
14870 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
14880 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
14890 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
148a0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
148b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
148c0 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e  Commit && isOpen
148d0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
148e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
148f0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
14900 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
14910 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48  _FCNTL_COMMIT_PH
14920 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20  ASETWO, 0);.    
14930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
14940 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
14950 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14960 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14970 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
14980 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
14990 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
149a0 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
149b0 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
149c0 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
149d0 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
149e0 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
149f0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
14a00 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
14a10 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
14a20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
14a30 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
14a40 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
14a50 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
14a60 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
14a70 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
14a80 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
14a90 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
14aa0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
14ab0 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
14ac0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
14ad0 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
14ae0 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
14af0 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
14b00 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
14b10 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
14b20 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
14b30 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
14b40 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
14b50 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
14b60 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
14b70 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
14b80 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
14b90 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
14ba0 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
14bb0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
14bc0 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
14bd0 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
14be0 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
14bf0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
14c00 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
14c10 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
14c20 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
14c30 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
14c40 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
14c50 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
14c60 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
14c70 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
14c80 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
14c90 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14ca0 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
14cb0 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
14cc0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
14cd0 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
14ce0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
14cf0 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
14d00 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
14d10 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
14d20 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
14d30 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
14d40 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
14d50 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
14d60 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
14d70 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
14d80 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
14d90 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
14da0 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
14db0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
14dc0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
14dd0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14de0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
14df0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
14e00 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
14e10 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
14e20 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
14e30 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
14e40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
14e50 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
14e60 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
14e70 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
14e80 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
14e90 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
14ea0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
14eb0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
14ec0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
14ed0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
14ee0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
14ef0 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
14f00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
14f10 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
14f20 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
14f30 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
14f40 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
14f50 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
14f60 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
14f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
14f80 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
14f90 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14fa0 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
14fb0 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
14fc0 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
14fd0 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
14fe0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
14ff0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
15000 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
15010 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
15020 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
15030 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
15040 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
15050 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
15060 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
15070 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
15080 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
15090 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
150a0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
150b0 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
150c0 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
150d0 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
150e0 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
150f0 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
15100 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
15110 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
15120 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
15130 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
15140 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
15150 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
15160 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
15170 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
15180 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
15190 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
151a0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
151b0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
151c0 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
151d0 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
151e0 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
151f0 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
15200 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
15210 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
15220 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
15230 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
15240 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
15250 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
15260 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
15270 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
15280 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
15290 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
152a0 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
152b0 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
152c0 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
152d0 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
152e0 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
152f0 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
15300 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
15310 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
15320 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
15330 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
15340 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
15350 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
15360 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
15370 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
15380 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
15390 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
153a0 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
153b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
153c0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
153d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
153e0 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
153f0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
15400 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
15410 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
15420 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
15430 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
15440 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
15450 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
15460 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
15470 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
15480 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
15490 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
154a0 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
154b0 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
154c0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
154d0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
154e0 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
154f0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
15500 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
15510 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
15520 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
15550 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
15560 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
15570 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
15580 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
15590 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
155a0 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
155b0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
155c0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
155d0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
155e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
155f0 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20  ved bits is the 
15600 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74  same in the dest
15610 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72  ination.** pager
15620 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65   as it is in the
15630 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63   source.  This c
15640 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56  omes up when a V
15650 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68  ACUUM changes th
15660 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
15670 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20  eserved bits to 
15680 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d  the "optimal" am
15690 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
156a0 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52  lite3PagerAlignR
156b0 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44  eserve(Pager *pD
156c0 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63  est, Pager *pSrc
156d0 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ){.  if( pDest->
156e0 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e  nReserve!=pSrc->
156f0 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20  nReserve ){.    
15700 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20  pDest->nReserve 
15710 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  = pSrc->nReserve
15720 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
15730 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20  tSize(pDest);.  
15740 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
15750 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
15760 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
15770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
15780 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
15790 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
157a0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
157b0 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
157c0 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
157d0 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
157e0 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
157f0 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
15800 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
15810 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
15820 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
15830 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
15840 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
15850 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
15860 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
15870 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
15880 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20   uses checksums 
15890 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
158a0 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a  journal does .**
158b0 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
158c0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
158d0 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
158e0 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
158f0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
15900 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
15910 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
15920 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
15930 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
15940 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
15950 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
15960 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
15970 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
15980 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
15990 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
159a0 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
159b0 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
159c0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
159d0 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
159e0 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
159f0 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
15a00 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
15a10 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
15a20 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
15a30 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
15a40 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
15a50 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
15a60 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
15a70 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
15a80 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
15a90 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
15aa0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
15ab0 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
15ac0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
15ad0 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
15ae0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
15af0 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
15b00 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
15b10 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
15b20 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
15b30 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
15b40 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
15b50 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15b60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
15b70 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
15b80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15b90 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
15ba0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
15bb0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
15bc0 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
15bd0 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
15be0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
15bf0 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
15c00 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
15c10 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
15c20 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
15c30 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
15c40 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
15c50 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
15c60 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
15c70 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
15c80 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
15c90 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
15ca0 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
15cb0 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
15cc0 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
15cd0 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
15ce0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
15cf0 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
15d00 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
15d10 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
15d20 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
15d30 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
15d40 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
15d50 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
15d60 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
15d70 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
15d80 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
15d90 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
15da0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
15db0 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
15dc0 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
15dd0 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
15de0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
15df0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
15e00 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
15e10 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
15e20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
15e30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
15e40 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
15e50 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
15e60 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
15e70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
15e80 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
15e90 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
15ea0 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
15eb0 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
15ec0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
15ed0 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
15ee0 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
15ef0 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
15f00 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
15f10 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
15f20 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
15f30 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
15f40 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
15f50 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
15f60 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
15f70 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
15f80 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
15f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15fa0 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
15fb0 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
15fc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
15fd0 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15ff0 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
16000 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
16010 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
16040 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
16050 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
16060 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
16070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16080 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
16090 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
160a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
160b0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
160c0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
160d0 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
160e0 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
160f0 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
16100 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16110 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16120 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
16130 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
16140 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
16150 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16160 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
16170 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20  is synced */..  
16180 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a  assert( (isMainJ
16190 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  rnl&~1)==0 );   
161a0 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c     /* isMainJrnl
161b0 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
161c0 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70  assert( (isSavep
161d0 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nt&~1)==0 );    
161e0 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20     /* isSavepnt 
161f0 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
16200 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e  ssert( isMainJrn
16210 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20  l || pDone );   
16220 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79    /* pDone alway
16230 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f  s used on sub-jo
16240 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65  urnals */.  asse
16250 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c  rt( isSavepnt ||
16260 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f   pDone==0 );   /
16270 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73  * pDone never us
16280 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f  ed on non-savepo
16290 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20  int */..  aData 
162a0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
162b0 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ace;.  assert( a
162c0 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20  Data );         
162d0 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
162e0 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
162f0 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
16300 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61   */.  assert( pa
16310 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
16320 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e  )==0 || (!isMain
16330 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e  Jrnl && isSavepn
16340 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68  t) );..  /* Eith
16350 65 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20  er the state is 
16360 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47  greater than PAG
16370 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
16380 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f  OD (a transactio
16390 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70  n .  ** or savep
163a0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f  oint rollback do
163b0 6e 65 20 61 74 20 74 68 65 20 72 65 71 75 65 73  ne at the reques
163c0 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29  t of the caller)
163d0 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a   or this is.  **
163e0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
163f0 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69  ollback. If it i
16400 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
16410 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61  rollback, the pa
16420 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73  ger.  ** is in s
16430 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f  tate OPEN and ho
16440 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  lds an EXCLUSIVE
16450 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e   lock. Hot-journ
16460 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  al rollback.  **
16470 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d   only reads from
16480 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16490 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a  l, not the sub-j
164a0 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
164b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
164c0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
164d0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
164e0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
164f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
16500 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  EN && pPager->eL
16510 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
16520 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65  OCK).  );.  asse
16530 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
16540 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
16550 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d  _CACHEMOD || isM
16560 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a  ainJrnl );..  /*
16570 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e   Read the page n
16580 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64  umber and page d
16590 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ata from the jou
165a0 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
165b0 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52  nal.  ** file. R
165c0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
165d0 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
165e0 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  r if an IO error
165f0 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20   occurs..  */.  
16600 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c  jfd = isMainJrnl
16610 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
16620 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20   pPager->sjfd;. 
16630 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
16640 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20  (jfd, *pOffset, 
16650 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
16660 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
16670 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
16680 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
16690 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  d, (u8*)aData, p
166a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
166b0 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a   (*pOffset)+4);.
166c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
166d0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
166e0 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70  .  *pOffset += p
166f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
16700 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c  + 4 + isMainJrnl
16710 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  *4;..  /* Sanity
16720 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
16730 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
16740 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
16750 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
16760 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
16770 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
16780 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
16790 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
167a0 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
167b0 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
167c0 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
167d0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
167e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
167f0 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
16800 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
16810 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
16820 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
16830 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
16840 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
16850 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
16860 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
16870 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
16880 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20   !isSavepnt );. 
16890 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
168a0 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
168b0 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
168c0 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71  er->dbSize || sq
168d0 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
168e0 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a  pDone, pgno) ){.
168f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16900 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
16910 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
16920 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
16930 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74  s(jfd, (*pOffset
16940 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  )-4, &cksum);.  
16950 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
16960 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69  n rc;.    if( !i
16970 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65  sSavepnt && page
16980 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
16990 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73  (u8*)aData)!=cks
169a0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
169b0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
169c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
169d0 49 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73  If this page has
169e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
169f0 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f 72 65  ayed back before
16a00 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
16a10 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
16a20 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
16a30 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
16a40 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
16a50 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
16a60 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
16a70 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16a80 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
16a90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
16aa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
16ab0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
16ac0 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
16ad0 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
16ae0 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
16af0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
16b00 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
16b10 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
16b20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
16b30 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
16b40 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
16b50 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
16b60 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
16b70 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16b80 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
16b90 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
16ba0 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
16bb0 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
16bc0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16bd0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
16be0 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
16bf0 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
16c00 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
16c10 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
16c20 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
16c30 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
16c40 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
16c50 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
16c60 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
16c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16c80 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
16c90 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
16ca0 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
16cb0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
16cc0 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
16cd0 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
16ce0 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
16cf0 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
16d00 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
16d10 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
16d20 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
16d30 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
16d40 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16d50 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
16d60 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
16d70 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16d80 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
16d90 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
16da0 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
16db0 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
16dc0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
16dd0 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
16de0 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
16df0 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
16e00 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
16e10 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
16e20 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
16e30 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
16e40 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
16e50 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
16e60 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
16e70 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
16e80 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
16e90 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
16ea0 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
16eb0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
16ec0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
16ed0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
16ee0 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
16ef0 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
16f00 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
16f10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
16f20 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
16f30 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
16f40 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
16f50 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
16f60 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
16f70 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
16f80 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
16f90 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
16fa0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
16fb0 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
16fc0 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
16fd0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
16fe0 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
16ff0 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
17000 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
17010 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
17020 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
17030 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
17040 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
17050 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
17060 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
17070 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
17080 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
17090 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
170a0 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
170b0 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
170c0 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
170d0 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
170e0 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
170f0 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
17100 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
17110 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
17120 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
17130 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
17140 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
17150 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
17160 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
17170 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
17180 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
17190 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
171a0 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
171b0 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
171c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
171d0 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
171e0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
171f0 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
17200 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
17210 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
17220 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
17230 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
17240 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
17250 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
17260 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
17270 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
17280 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
17290 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
172a0 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
172b0 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
172c0 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
172d0 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
172e0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
172f0 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
17300 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
17310 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
17320 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
17330 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
17340 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
17350 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
17360 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
17370 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
17380 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
17390 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
173a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
173b0 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
173c0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
173d0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
173e0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
173f0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
17400 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
17410 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
17420 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
17430 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50  || pPg==0 );.  P
17440 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
17450 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
17460 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
17470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
17480 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
17490 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
174a0 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
174b0 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
174c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
174d0 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
174e0 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
174f0 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
17500 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
17510 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
17520 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
17530 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
17540 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
17550 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
17560 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
17570 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
17580 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
17590 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
175a0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
175b0 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70  er->fd).   && (p
175c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
175d0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
175e0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
175f0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
17600 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
17610 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
17620 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
17630 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
17640 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
17650 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17660 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
17670 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
17680 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
17690 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
176a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
176b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
176c0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
176d0 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
176e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
176f0 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
17700 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
17710 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
17720 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
17730 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
17740 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
17750 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
17760 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
17770 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17780 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
17790 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
177a0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
177b0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
177c0 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
177d0 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  *)aData);.      
177e0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
177f0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
17800 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
17810 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  KPT, aData);.   
17820 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
17830 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
17840 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
17850 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
17860 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
17870 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
17880 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
17890 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
178a0 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
178b0 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
178c0 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
178d0 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
178e0 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
178f0 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
17900 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
17910 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
17920 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
17930 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
17940 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
17950 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
17960 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
17970 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
17980 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
17990 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
179a0 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
179b0 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
179c0 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
179d0 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
179e0 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
179f0 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
17a00 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
17a10 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
17a20 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
17a30 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
17a40 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
17a50 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
17a60 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
17a70 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
17a80 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17a90 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
17aa0 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
17ab0 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
17ac0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
17ad0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
17ae0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
17af0 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
17b00 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
17b10 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
17b20 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
17b30 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
17b40 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
17b50 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
17b60 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
17b70 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
17b80 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
17b90 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
17ba0 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
17bb0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
17bc0 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
17bd0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
17be0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
17bf0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17c00 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
17c10 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
17c20 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
17c30 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
17c40 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
17c50 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
17c60 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  g, 1);.    asser
17c70 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
17c80 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
17c90 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20  AG_ROLLBACK)!=0 
17ca0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
17cb0 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
17cc0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17cd0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17ce0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17cf0 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c   rc;.    pPg->fl
17d00 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
17d10 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
17d20 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
17d30 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
17d40 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
17d50 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
17d60 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
17d70 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
17d80 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
17d90 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
17da0 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
17db0 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
17dc0 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
17dd0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
17de0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
17df0 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
17e00 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
17e10 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
17e20 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
17e30 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
17e40 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
17e50 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
17e60 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
17e70 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
17e80 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
17e90 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
17ea0 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
17eb0 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
17ec0 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
17ed0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
17ee0 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
17ef0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
17f00 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61  g);.    if( isMa
17f10 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
17f20 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65  vepnt || *pOffse
17f30 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t<=pPager->journ
17f40 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20  alHdr) ){.      
17f50 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
17f60 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  ts of this page 
17f70 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72  were just restor
17f80 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
17f90 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
17fa0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
17fb0 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62  s content must b
17fc0 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77  e as they were w
17fd0 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  hen the .      *
17fe0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
17ff0 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
18000 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
18010 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  can mark the pag
18020 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c  e.      ** as cl
18030 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ean, since there
18040 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64   will be no need
18050 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74   to write it out
18060 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
18070 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
18080 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
18090 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
180a0 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
180b0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
180c0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
180d0 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
180e0 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
180f0 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
18100 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
18110 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
18120 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
18130 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
18140 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
18150 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
18160 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
18170 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
18180 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
18190 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
181a0 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
181b0 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
181c0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
181d0 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
181e0 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
181f0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
18200 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
18210 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
18220 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
18230 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
18240 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
18250 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
18260 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
18270 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
18280 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
18290 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
182a0 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
182b0 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
182c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
182d0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
182e0 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
182f0 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
18300 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
18310 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
18320 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
18330 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
18340 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
18350 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
18360 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
18370 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
18380 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
18390 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
183a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
183b0 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
183c0 73 75 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  sue..      **.  
183d0 20 20 20 20 2a 2a 20 55 70 64 61 74 65 3a 20 41      ** Update: A
183e0 6e 6f 74 68 65 72 20 65 78 63 65 70 74 69 6f 6e  nother exception
183f0 20 69 73 20 66 6f 72 20 74 65 6d 70 20 66 69 6c   is for temp fil
18400 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  es that are not 
18410 0a 20 20 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d  .      ** in-mem
18420 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 49  ory databases. I
18430 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
18440 70 61 67 65 20 6d 61 79 20 68 61 76 65 20 62 65  page may have be
18450 65 6e 20 64 69 72 74 79 0a 20 20 20 20 20 20 2a  en dirty.      *
18460 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  * at the start o
18470 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
18480 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
18490 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
184a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
184b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
184c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
184d0 29 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  ) sqlite3PcacheM
184e0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
184f0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
18500 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
18510 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
18520 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
18530 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
18540 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
18550 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
18560 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
18570 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
18580 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
18590 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
185a0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
185b0 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
185c0 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
185d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
185e0 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
185f0 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
18600 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
18610 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
18620 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
18630 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
18640 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18650 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 73 71 6c  M_BKPT);.    sql
18660 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
18670 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
18680 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18690 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
186a0 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
186b0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
186c0 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
186d0 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
186e0 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
186f0 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
18700 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
18710 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
18720 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
18730 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
18740 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
18750 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
18760 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18770 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
18780 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
18790 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
187a0 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
187b0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
187c0 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
187d0 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
187e0 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
187f0 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
18800 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  n..**.** When a 
18810 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18820 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
18830 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  it is populated 
18840 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a  with the names .
18850 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73  ** of all of its
18860 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c   child journals,
18870 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68   one after anoth
18880 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73  er, formatted as
18890 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64   utf-8 .** encod
188a0 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64  ed text. The end
188b0 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a   of each child j
188c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d  ournal file is m
188d0 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a  arked with a .**
188e0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
188f0 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65  byte (0x00). i.e
18900 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  . the entire con
18910 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65  tents of a maste
18920 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  r journal.** fil
18930 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  e for a transact
18940 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77  ion involving tw
18950 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68  o databases migh
18960 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f  t be:.**.**   "/
18970 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a  home/bill/a.db-j
18980 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f  ournal\x00/home/
18990 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61  bill/b.db-journa
189a0 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d  l\x00".**.** A m
189b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
189c0 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64  le may only be d
189d0 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20  eleted once all 
189e0 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a  of its child .**
189f0 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62   journals have b
18a00 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
18a10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
18a20 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63  tion reads the c
18a30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
18a40 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
18a50 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f  le into .** memo
18a60 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72  ry and loops thr
18a70 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65  ough each of the
18a80 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e   child journal n
18a90 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63  ames. For.** eac
18aa0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c  h child journal,
18ab0 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a   it checks if:.*
18ac0 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  *.**   * if the 
18ad0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78  child journal ex
18ae0 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a  ists, and if so.
18af0 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
18b00 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  ild journal cont
18b10 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65  ains a reference
18b20 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
18b30 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  al .**     file 
18b40 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66  zMaster.**.** If
18b50 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c   a child journal
18b60 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
18b70 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20  at matches both 
18b80 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  of the criteria.
18b90 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66  ** above, this f
18ba0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
18bb0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
18bc0 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  ything. Otherwis
18bd0 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  e, if.** no such
18be0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
18bf0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c  an be found, fil
18c00 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c  e zMaster is del
18c10 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  eted from.** the
18c20 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69   file-system usi
18c30 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
18c40 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  te()..**.** If a
18c50 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69  n IO error withi
18c60 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
18c70 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
18c80 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
18c90 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
18ca0 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79  ocates memory by
18cb0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
18cc0 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20  Malloc(). If an 
18cd0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
18ce0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
18cf0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
18d00 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
18d10 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  IO or malloc err
18d20 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53  ors .** occur, S
18d30 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18d40 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  rned..**.** TODO
18d50 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
18d60 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67  allocates a sing
18d70 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  le block of memo
18d80 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68  ry to load.** th
18d90 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
18da0 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
18db0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
18dc0 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  is could be.** a
18dd0 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62   couple of kilob
18de0 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74  ytes or so - pot
18df0 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20  entially larger 
18e00 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a  than the page .*
18e10 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  * size..*/.stati
18e20 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
18e30 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
18e40 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
18e50 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
18e60 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
18e70 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
18e80 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
18e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18ea0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
18eb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
18ec0 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c  ster;    /* Mall
18ed0 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72  oc'd master-jour
18ee0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
18ef0 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
18f00 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
18f10 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63     /* Malloc'd c
18f20 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild-journal fil
18f30 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
18f40 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
18f50 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
18f60 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
18f70 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
18f80 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
18f90 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
18fa0 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
18fb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18fc0 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
18fd0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
18fe0 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f  ointer to one jo
18ff0 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20  urnal within MJ 
19000 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
19010 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  zMasterPtr;     
19020 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
19030 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65  hold MJ filename
19040 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20   from a journal 
19050 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  file */.  int nM
19060 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
19070 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
19080 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
19090 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d   to zMasterPtr[]
190a0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
190b0 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
190c0 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
190d0 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
190e0 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
190f0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
19100 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
19110 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
19120 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
19130 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
19140 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
19150 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
19160 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
19170 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
19180 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
19190 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
191a0 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
191b0 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
191c0 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
191d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
191e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
191f0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
19200 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
19210 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
19220 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
19230 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
19240 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
19250 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
19260 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
19270 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
19280 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19290 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f  master_out;..  /
192a0 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
192b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
192c0 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
192d0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
192e0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
192f0 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
19300 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
19310 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62  urnal.   Also ob
19320 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63  tain.  ** suffic
19330 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a  ient space (in z
19340 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f  MasterPtr) to ho
19350 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ld the names of 
19360 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72  master.  ** jour
19370 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63  nal files extrac
19380 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72  ted from regular
19390 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
193a0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ls..  */.  rc = 
193b0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
193c0 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
193d0 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
193e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
193f0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
19400 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72  r_out;.  nMaster
19410 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
19420 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73  thname+1;.  zMas
19430 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
19440 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  ite3Malloc(nMast
19450 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
19460 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69  terPtr + 1);.  i
19470 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
19480 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
19490 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
194a0 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61  ;.    goto delma
194b0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  ster_out;.  }.  
194c0 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
194d0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
194e0 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
194f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19500 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
19510 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69  asterJournal, (i
19520 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
19530 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  l, 0);.  if( rc!
19540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
19550 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19560 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
19570 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
19580 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e  ] = 0;..  zJourn
19590 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
195a0 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a  nal;.  while( (z
195b0 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
195c0 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
195d0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
195e0 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63  t exists;.    rc
195f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
19600 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
19610 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
19620 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
19630 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
19640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19650 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
19660 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
19670 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
19680 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
19690 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
196a0 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
196b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
196c0 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65  ts..      ** Ope
196d0 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
196e0 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
196f0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19700 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73  l. If.      ** s
19710 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
19720 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
19730 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19740 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
19750 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
19760 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
19770 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
19780 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
19790 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
197a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
197b0 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
197c0 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
197d0 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
197e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
197f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
19800 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19810 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19820 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
19830 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c  Journal(pJournal
19840 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
19850 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
19860 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19870 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  pJournal);.     
19880 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19890 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
198a0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
198b0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
198c0 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
198d0 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
198e0 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
198f0 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69  ter)==0;.      i
19900 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
19910 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
19920 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
19930 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
19940 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
19950 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
19960 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
19970 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75  }.    }.    zJou
19980 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33  rnal += (sqlite3
19990 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61  Strlen30(zJourna
199a0 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73  l)+1);.  }. .  s
199b0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
199c0 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  aster);.  rc = s
199d0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
199e0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
199f0 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
19a00 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
19a10 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
19a20 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20  ;.  if( pMaster 
19a30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
19a40 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
19a50 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f      assert( !isO
19a60 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b  pen(pJournal) );
19a70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
19a80 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(pMaster);.  }.
19a90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19aa0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
19ab0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
19ac0 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61  change the actua
19ad0 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
19ae0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
19af0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
19b00 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61  em. This only ha
19b10 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69  ppens when commi
19b20 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
19b30 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69  ion,.** or rolli
19b40 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ng back a transa
19b50 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67  ction (including
19b60 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
19b70 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a  hot-journal)..**
19b80 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
19b90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
19ba0 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68   not open, or th
19bb0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
19bc0 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f  n either.** DBMO
19bd0 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c  D or OPEN state,
19be0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
19bf0 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
19c00 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a  wise, the size .
19c10 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
19c20 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61  s changed to nPa
19c30 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a  ge pages (nPage*
19c40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19c50 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20   bytes). .** If 
19c60 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
19c70 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61   is currently la
19c80 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20  rger than nPage 
19c90 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20  pages, then use 
19ca0 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e  the VFS.** xTrun
19cb0 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f  cate() method to
19cc0 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a   truncate it..**
19cd0 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74  .** Or, it might
19ce0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
19cf0 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
19d00 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
19d10 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
19d20 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
19d30 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
19d40 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
19d50 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
19d60 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
19d70 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
19d80 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
19d90 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
19da0 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
19db0 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
19dc0 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
19dd0 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
19de0 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
19df0 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
19e00 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
19e10 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
19e20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19e30 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
19e40 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
19e50 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
19e60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
19e70 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
19e80 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
19e90 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
19ea0 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
19eb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
19ec0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
19ed0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19ee0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
19ef0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
19f00 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
19f10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
19f20 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44  tate!=PAGER_READ
19f30 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69  ER );.  .  if( i
19f40 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
19f50 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  ) .   && (pPager
19f60 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
19f70 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
19f80 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
19f90 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29  PAGER_OPEN) .  )
19fa0 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
19fb0 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
19fc0 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d      int szPage =
19fd0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19fe0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
19ff0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
1a000 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
1a010 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20      /* TODO: Is 
1a020 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50  it safe to use P
1a030 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20  ager.dbFileSize 
1a040 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20  here? */.    rc 
1a050 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1a060 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
1a070 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
1a080 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50     newSize = szP
1a090 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  age*(i64)nPage;.
1a0a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a0b0 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
1a0c0 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
1a0d0 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
1a0e0 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
1a0f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1a100 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
1a110 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
1a120 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
1a130 73 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53  se if( (currentS
1a140 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77  ize+szPage)<=new
1a150 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1a160 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61  char *pTmp = pPa
1a170 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1a180 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
1a190 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b  Tmp, 0, szPage);
1a1a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a1b0 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
1a1c0 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69  ge) == currentSi
1a1d0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ze );.        te
1a1e0 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1a1f0 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72  -szPage) >  curr
1a200 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1a210 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a220 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
1a230 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c  d, pTmp, szPage,
1a240 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29   newSize-szPage)
1a250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a260 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a270 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1a280 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
1a290 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
1a2a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a2b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a2c0 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69   Return a saniti
1a2d0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  zed version of t
1a2e0 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f  he sector-size o
1a2f0 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e  f OS file pFile.
1a300 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
1a310 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65  alue is guarante
1a320 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65  ed to lie betwee
1a330 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43  n 32 and MAX_SEC
1a340 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74  TOR_SIZE..*/.int
1a350 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
1a360 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1a370 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69  *pFile){.  int i
1a380 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  Ret = sqlite3OsS
1a390 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29  ectorSize(pFile)
1a3a0 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20  ;.  if( iRet<32 
1a3b0 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31  ){.    iRet = 51
1a3c0 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  2;.  }else if( i
1a3d0 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  Ret>MAX_SECTOR_S
1a3e0 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  IZE ){.    asser
1a3f0 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  t( MAX_SECTOR_SI
1a400 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69  ZE>=512 );.    i
1a410 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52  Ret = MAX_SECTOR
1a420 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _SIZE;.  }.  ret
1a430 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn iRet;.}../*.
1a440 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
1a450 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
1a460 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1a470 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
1a480 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
1a490 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
1a4a0 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
1a4b0 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
1a4c0 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
1a4d0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
1a4e0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1a4f0 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f  l be used .** to
1a500 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1a510 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e  ize and alignmen
1a520 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
1a530 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74  der and .** mast
1a540 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
1a550 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74  ers within creat
1a560 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ed journal files
1a570 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
1a580 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20  orary files the 
1a590 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a5a0 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20   size is always 
1a5b0 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  512 bytes..**.**
1a5c0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
1a5d0 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69  non-temporary fi
1a5e0 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69  les, the effecti
1a5f0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
1a600 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  s.** the value r
1a610 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
1a620 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74  SectorSize() met
1a630 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74  hod rounded up t
1a640 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73  o 32 if.** it is
1a650 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f   less than 32, o
1a660 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74  r rounded down t
1a670 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  o MAX_SECTOR_SIZ
1a680 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72  E if it.** is gr
1a690 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53  eater than MAX_S
1a6a0 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a  ECTOR_SIZE..**.*
1a6b0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
1a6c0 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  s the SQLITE_IOC
1a6d0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1a6e0 52 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c  RWRITE property,
1a6f0 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65   then set.** the
1a700 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a710 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69  r size to its mi
1a720 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32  nimum value (512
1a730 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  ).  The purpose 
1a740 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65  of.** pPager->se
1a750 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64  ctorSize is to d
1a760 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74  efine the "blast
1a770 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65   radius" of byte
1a780 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  s that.** might 
1a790 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73  change if a cras
1a7a0 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77  h occurs while w
1a7b0 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67  riting to a sing
1a7c0 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68  le byte in.** th
1a7d0 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77  at range.  But w
1a7e0 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  ith POWERSAFE_OV
1a7f0 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61  ERWRITE, the bla
1a800 73 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72  st radius is zer
1a810 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68  o.** (that is wh
1a820 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  at POWERSAFE_OVE
1a830 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73  RWRITE means), s
1a840 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  o we minimize th
1a850 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65  e sector.** size
1a860 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  .  For backwards
1a870 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f   compatibility o
1a880 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1a890 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1a8a0 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74  at,.** we cannot
1a8b0 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
1a8c0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1a8d0 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a  e below 512..*/.
1a8e0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
1a8f0 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
1a900 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
1a910 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1a920 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1a930 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
1a940 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
1a950 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c  pFile.   || (sql
1a960 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1a970 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1a980 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20  er->fd) & .     
1a990 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1a9a0 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1a9b0 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20  OVERWRITE)!=0.  
1a9c0 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ){.    /* Sector
1a9d0 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61   size doesn't ma
1a9e0 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61  tter for tempora
1a9f0 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20  ry files. Also, 
1aa00 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
1aa10 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
1aa20 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e  n opened yet, in
1aa30 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
1aa40 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
1aa50 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20     ** call will 
1aa60 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20  segfault. */.   
1aa70 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1aa80 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  ize = 512;.  }el
1aa90 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
1aaa0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
1aab0 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70  ite3SectorSize(p
1aac0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
1aad0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
1aae0 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
1aaf0 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
1ab00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ab10 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
1ab20 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
1ab30 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
1ab40 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
1ab50 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
1ab60 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
1ab70 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
1ab80 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
1ab90 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
1aba0 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
1abb0 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
1abc0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1abd0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1abe0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
1abf0 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
1ac00 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
1ac10 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
1ac20 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
1ac30 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
1ac40 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
1ac50 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
1ac60 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
1ac70 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
1ac80 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
1ac90 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1aca0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1acb0 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
1acc0 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
1acd0 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
1ace0 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
1acf0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1ad00 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1ad10 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
1ad20 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
1ad30 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
1ad40 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
1ad50 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
1ad60 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1ad70 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
1ad80 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
1ad90 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
1ada0 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
1adb0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
1adc0 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
1add0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1ade0 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
1adf0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20   size..**  (7)  
1ae00 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74  zero padding out
1ae10 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
1ae20 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38  tor size..**  (8
1ae30 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
1ae40 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
1ae50 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
1ae60 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
1ae70 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
1ae80 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
1ae90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1aea0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
1aeb0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1aec0 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
1aed0 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
1aee0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1aef0 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
1af00 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d  the first 7 item
1af10 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
1af20 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
1af30 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
1af40 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20  ance of the 8th 
1af50 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
1af60 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
1af70 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
1af80 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
1af90 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1afa0 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
1afb0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
1afc0 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
1afd0 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
1afe0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
1aff0 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
1b000 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b010 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1b020 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
1b030 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
1b040 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
1b050 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
1b060 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
1b070 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
1b080 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
1b090 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b0a0 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
1b0b0 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
1b0c0 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
1b0d0 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
1b0e0 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
1b0f0 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
1b100 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
1b110 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1b120 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
1b130 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
1b140 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
1b150 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
1b160 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
1b170 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
1b180 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
1b190 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
1b1a0 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
1b1b0 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
1b1c0 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
1b1d0 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
1b1e0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1b1f0 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
1b200 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
1b210 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
1b220 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
1b230 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
1b240 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
1b250 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
1b260 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
1b270 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
1b280 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
1b290 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
1b2a0 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
1b2b0 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
1b2c0 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
1b2d0 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
1b2e0 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
1b2f0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
1b300 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
1b310 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
1b320 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
1b330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1b340 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
1b350 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
1b360 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
1b370 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
1b380 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
1b390 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1b3a0 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
1b3b0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1b3c0 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
1b3d0 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
1b3e0 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
1b3f0 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
1b400 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
1b410 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
1b420 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
1b430 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
1b440 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
1b450 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
1b460 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
1b470 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1b480 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1b490 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
1b4a0 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
1b4b0 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
1b4c0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
1b4d0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
1b4e0 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
1b4f0 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
1b500 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
1b510 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
1b520 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
1b530 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
1b540 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
1b550 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1b560 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
1b570 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
1b580 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
1b590 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
1b5a0 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
1b5b0 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
1b5c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1b5d0 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
1b5e0 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
1b5f0 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
1b600 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
1b610 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
1b620 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
1b630 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1b640 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1b650 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b670 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1b680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
1b690 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
1b6a0 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
1b6b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b6c0 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
1b6d0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
1b6e0 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1b6f0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1b700 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1b710 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
1b720 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1b730 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
1b740 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
1b750 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1b780 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
1b790 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
1b7a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b7b0 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
1b7c0 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
1b7d0 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
1b7e0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
1b7f0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
1b800 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1b810 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
1b820 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
1b830 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
1b840 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
1b850 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
1b860 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   rollback */.  i
1b870 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30  nt nPlayback = 0
1b880 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ;       /* Total
1b890 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1b8a0 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a   restored from j
1b8b0 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  ournal */..  /* 
1b8c0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1b8d0 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
1b8e0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1b8f0 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
1b900 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1b910 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
1b920 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1b930 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1b940 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1b950 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1b960 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
1b970 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b980 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
1b990 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1b9a0 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
1b9b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
1b9c0 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
1b9d0 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
1b9e0 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
1b9f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1ba00 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
1ba10 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
1ba20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
1ba30 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
1ba40 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1ba50 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
1ba60 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
1ba70 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
1ba80 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
1ba90 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
1baa0 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
1bab0 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
1bac0 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
1bad0 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
1bae0 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
1baf0 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
1bb00 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
1bb10 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
1bb20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
1bb30 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
1bb40 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1bb50 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
1bb60 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61  nix.c,.  ** mxPa
1bb70 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77  thname is 512, w
1bb80 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65  hich is the same
1bb90 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   as the minimum 
1bba0 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a  allowable value.
1bbb0 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a    ** for pageSiz
1bbc0 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  e..  */.  zMaste
1bbd0 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1bbe0 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
1bbf0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1bc00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1bc10 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1bc20 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1bc30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1bc40 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1bc50 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
1bc60 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1bc70 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1bc80 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1bc90 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
1bca0 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
1bcb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bcc0 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
1bcd0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1bce0 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
1bcf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1bd00 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52   0;.  needPagerR
1bd10 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20  eset = isHot;.. 
1bd20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
1bd30 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
1bd40 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e  when a readJourn
1bd50 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a  alHdr() or .  **
1bd60 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1bd70 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20  one_page() call 
1bd80 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1bd90 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
1bda0 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e  or .  ** occurs.
1bdb0 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20   .  */.  while( 
1bdc0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64  1 ){.    /* Read
1bdd0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
1bde0 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
1bdf0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1be00 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
1be10 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
1be20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
1be30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1be40 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
1be50 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
1be60 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
1be70 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
1be80 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1be90 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
1bea0 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
1beb0 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
1bec0 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
1bed0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
1bee0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
1bef0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
1bf00 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a  ager, isHot, szJ
1bf10 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
1bf20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1bf30 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
1bf40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bf50 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1bf60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1bf70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1bf80 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1bf90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1bfa0 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
1bfb0 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
1bfc0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
1bfd0 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1bfe0 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
1bff0 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
1c000 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1c010 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1c020 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1c030 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
1c040 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
1c050 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
1c060 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
1c070 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
1c080 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
1c090 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
1c0a0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1c0b0 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
1c0c0 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
1c0d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1c0e0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1c0f0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1c100 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
1c110 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a  = (int)((szJ - J
1c120 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1c130 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
1c140 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1c150 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c160 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
1c170 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
1c180 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1c190 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
1c1a0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
1c1b0 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
1c1c0 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
1c1d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
1c1e0 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
1c1f0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
1c200 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1c210 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
1c220 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
1c230 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
1c240 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
1c250 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
1c260 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
1c270 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
1c280 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
1c290 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
1c2a0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
1c2b0 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
1c2c0 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
1c2d0 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
1c2e0 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20  65..    ** When 
1c2f0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
1c300 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63  ot journal, nRec
1c310 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73  ==0 always means
1c320 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20   that the next. 
1c330 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74     ** chunk of t
1c340 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
1c350 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74  ins zero pages t
1c360 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1c370 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68  .  But.    ** wh
1c380 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42  en doing a ROLLB
1c390 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63  ACK and the nRec
1c3a0 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65  ==0 chunk is the
1c3b0 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20   last chunk in. 
1c3c0 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
1c3d0 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1c3e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1c3f0 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74  ht contain addit
1c400 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67  ional.    ** pag
1c410 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
1c420 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
1c430 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  nd that the numb
1c440 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20  er of pages .   
1c450 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f   ** should be co
1c460 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20  mputed based on 
1c470 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c480 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1c490 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
1c4a0 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
1c4b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1c4c0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
1c4d0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
1c4e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c4f0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
1c500 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
1c510 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c520 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
1c530 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1c540 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1c550 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
1c560 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
1c570 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
1c580 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
1c590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
1c5a0 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
1c5b0 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
1c5c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1c5d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
1c5e0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1c5f0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
1c600 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
1c610 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
1c620 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c640 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c650 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
1c660 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1c670 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
1c680 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
1c690 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
1c6a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1c6b0 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
1c6c0 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
1c6d0 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70  se file and/or p
1c6e0 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  age cache..    *
1c6f0 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
1c700 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
1c710 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72     if( needPager
1c720 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  Reset ){.       
1c730 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1c740 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ger);.        ne
1c750 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30  edPagerReset = 0
1c760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c770 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1c780 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
1c790 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75  ger,&pPager->jou
1c7a0 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a  rnalOff,0,1,0);.
1c7b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c7c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c7d0 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a     nPlayback++;.
1c7e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c7f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c800 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1c810 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1c820 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
1c830 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c840 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1c850 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1c860 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1c870 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1c880 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  f the journal ha
1c890 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64  s been truncated
1c8a0 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65  , simply stop re
1c8b0 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  ading and.      
1c8c0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
1c8d0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  g the journal. T
1c8e0 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1c8f0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1c900 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1c910 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
1c920 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
1c930 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72  ed prior to a cr
1c940 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ash.  In that.  
1c950 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c          ** case,
1c960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
1c970 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20  ould have never 
1c980 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20  been written in 
1c990 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1c9a0 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20   first place so 
1c9b0 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70  it is OK to simp
1c9c0 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  ly abandon the r
1c9d0 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20  ollback. */.    
1c9e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c9f0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
1ca00 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1ca10 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1ca20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1ca30 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
1ca40 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
1ca50 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
1ca60 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1ca70 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
1ca80 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
1ca90 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
1caa0 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
1cab0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
1cac0 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
1cad0 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
1cae0 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
1caf0 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
1cb00 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
1cb10 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
1cb20 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
1cb30 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
1cb40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1cb50 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1cb60 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1cb70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cb80 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
1cb90 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
1cba0 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
1cbb0 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
1cbc0 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
1cbd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1cbe0 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
1cbf0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
1cc00 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
1cc10 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1cc20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
1cc30 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
1cc40 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1cc50 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
1cc60 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
1cc70 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
1cc80 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
1cc90 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1cca0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
1ccb0 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23  modified..  */.#
1ccc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1ccd0 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  UG.  if( pPager-
1cce0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1ccf0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
1cd00 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
1cd10 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1cd20 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1cd30 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ED,0);.  }.#endi
1cd40 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  f..  /* If this 
1cd50 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1cd60 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1cd70 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1cd80 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1cd90 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1cda0 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1cdb0 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1cdc0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1cdd0 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1cde0 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1cdf0 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1ce00 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1ce10 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1ce20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1ce30 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1ce40 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1ce50 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1ce60 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1ce70 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1ce80 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1ce90 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1cea0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1ceb0 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1cec0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1ced0 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1cee0 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1cef0 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1cf00 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1cf10 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1cf20 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1cf30 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1cf40 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1cf50 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1cf60 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1cf70 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1cf80 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1cf90 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1cfa0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1cfb0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1cfc0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cfd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1cfe0 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1cff0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1d000 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1d010 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1d020 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1d030 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1d040 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1d050 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1d060 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1d070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1d080 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1d090 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1d0a0 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1d0b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1d0c0 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1d0d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d0e0 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29  rSync(pPager, 0)
1d0f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1d100 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d110 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1d120 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1d130 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1d140 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1d150 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1d160 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1d170 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d180 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1d190 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1d1a0 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1d1b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1d1c0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1d1d0 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1d1e0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1d1f0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1d200 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1d210 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1d220 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1d230 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1d240 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1d250 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1d260 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1d270 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1d280 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1d290 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1d2a0 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1d2b0 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1d2c0 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1d2d0 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1d2f0 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1d300 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1d310 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1d320 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1d330 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1d340 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1d350 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1d360 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1d370 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1d380 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1d390 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1d3a0 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1d3b0 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1d3c0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1d3d0 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1d3e0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1d3f0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1d400 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1d410 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1d420 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1d430 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d440 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
1d450 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
1d460 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
1d470 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
1d480 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1d490 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
1d4a0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1d4b0 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1d4c0 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
1d4d0 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
1d4e0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
1d4f0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
1d500 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
1d510 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1d520 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1d530 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
1d540 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1d550 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
1d560 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1d570 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
1d580 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1d590 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1d5a0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1d5b0 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
1d5c0 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a  g, u32 iFrame){.
1d5d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1d5e0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1d5f0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1d600 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1d610 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
1d620 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
1d630 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
1d640 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
1d650 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1d660 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1d670 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1d680 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1d690 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1d6a0 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1d6b0 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1d6c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1d6d0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1d6e0 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1d6f0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1d700 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1d710 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  fd) );..#ifndef 
1d720 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1d730 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a    if( iFrame ){.
1d740 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
1d750 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
1d760 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
1d770 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
1d780 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1d790 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1d7a0 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a  al, iFrame, pgsz
1d7b0 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
1d7c0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1d7d0 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1d7e0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1d7f0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1d800 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
1d810 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1d820 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1d830 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74  a, pgsz, iOffset
1d840 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d850 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1d860 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1d870 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d880 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1d890 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1d8a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1d8b0 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69  /* If the read i
1d8c0 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  s unsuccessful, 
1d8d0 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65  set the dbFileVe
1d8e0 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e  rs[] to somethin
1d8f0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  g.      ** that 
1d900 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20  will never be a 
1d910 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69  valid file versi
1d920 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b  on.  dbFileVers[
1d930 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20  ] is a copy.    
1d940 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34    ** of bytes 24
1d950 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1d960 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e  base.  Bytes 28.
1d970 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  .31 should alway
1d980 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65  s be.      ** ze
1d990 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  ro or the size o
1d9a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1d9b0 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32  n page. Bytes 32
1d9c0 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a  ..35 and 35..39.
1d9d0 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
1d9e0 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  be page numbers 
1d9f0 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
1da00 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20  0xffffffff.  So 
1da10 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  filling.      **
1da20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56   pPager->dbFileV
1da30 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30  ers[] with all 0
1da40 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64  xff bytes should
1da50 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20   suffice..      
1da60 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
1da70 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
1da80 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61  abase, the situa
1da90 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d  tion is more com
1daa0 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20  plex:  bytes.   
1dab0 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20     ** 24..39 of 
1dac0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
1dad0 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42   white noise.  B
1dae0 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  ut the probabili
1daf0 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ty of.      ** w
1db00 68 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c  hite noise equal
1db10 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
1db20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
1db30 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
1db40 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
1db50 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
1db60 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
1db70 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
1db80 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
1db90 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1dba0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
1dbb0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
1dbc0 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
1dbd0 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
1dbe0 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
1dbf0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1dc00 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1dc10 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1dc20 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1dc30 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
1dc40 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
1dc50 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
1dc60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1dc70 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52  _BKPT);..  PAGER
1dc80 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1dc90 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1dca0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1dcb0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1dcc0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1dcd0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1dce0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1dcf0 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1dd00 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1dd10 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1dd20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1dd30 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1dd40 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1dd50 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1dd60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1dd70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1dd80 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1dd90 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1dda0 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1ddb0 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1ddc0 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1ddd0 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1dde0 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1ddf0 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1de00 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1de10 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1de20 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1de30 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1de40 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1de50 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1de60 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1de70 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1de80 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1de90 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1dea0 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1deb0 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1dec0 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1ded0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1dee0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1def0 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1df00 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1df10 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1df20 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1df30 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1df40 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1df50 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1df60 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1df70 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1df80 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1df90 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1dfa0 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1dfb0 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1dfc0 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1dfd0 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1dfe0 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1dff0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1e000 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1e010 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1e020 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1e030 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1e040 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1e050 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1e060 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1e070 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1e080 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1e090 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1e0a0 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1e0b0 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1e0c0 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1e0d0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1e0e0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1e0f0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1e100 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e110 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1e120 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1e130 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1e140 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1e150 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1e160 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1e170 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1e180 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1e190 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1e1a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1e1b0 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1e1c0 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1e1d0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1e1e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1e1f0 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1e200 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1e210 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1e220 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1e230 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1e240 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1e250 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1e260 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1e270 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1e280 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1e290 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1e2a0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1e2b0 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1e2c0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1e2d0 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1e2e0 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1e2f0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1e300 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1e310 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1e320 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1e330 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1e340 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1e350 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1e360 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1e370 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1e380 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1e390 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e3a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1e3b0 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1e3c0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1e3d0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1e3e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1e3f0 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65  ;.  pPg = sqlite
1e400 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
1e410 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28  ger, iPg);.  if(
1e420 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20   pPg ){.    if( 
1e430 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1e440 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d  eRefcount(pPg)==
1e450 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1e460 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
1e470 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e480 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d      u32 iFrame =
1e490 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
1e4a0 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
1e4b0 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1e4c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72   pPg->pgno, &iFr
1e4d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
1e4e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e4f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
1e500 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46  adDbPage(pPg, iF
1e510 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rame);.      }. 
1e520 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e540 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1e550 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1e560 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1e570 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
1e580 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1e590 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1e5a0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1e5b0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1e5c0 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1e5d0 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1e5e0 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1e5f0 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1e600 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1e610 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1e620 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1e630 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1e640 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1e650 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1e660 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1e670 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1e680 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1e690 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1e6a0 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1e6b0 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1e6c0 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1e6d0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1e6e0 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1e6f0 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1e700 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1e710 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1e720 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1e730 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1e740 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1e750 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1e760 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1e770 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1e780 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1e790 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1e7a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1e7b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e7c0 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1e7d0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1e7e0 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1e7f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e800 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1e810 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e820 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1e850 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1e860 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1e870 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1e880 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1e890 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1e8a0 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1e8b0 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1e8c0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1e8d0 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1e8e0 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1e8f0 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1e900 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1e910 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1e920 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1e930 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1e940 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1e950 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1e960 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1e970 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1e980 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1e990 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1e9a0 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1e9b0 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1e9c0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1e9d0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1e9e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1e9f0 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1ea00 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1ea10 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1ea20 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1ea30 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1ea40 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1ea50 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77  r->pPCache);.  w
1ea60 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72  hile( pList && r
1ea70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ea80 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
1ea90 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1eaa0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1eab0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f  UndoCallback((vo
1eac0 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  id *)pPager, pLi
1ead0 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  st->pgno);.    p
1eae0 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
1eaf0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1eb00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1eb10 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
1eb20 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
1eb30 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41  e3WalFrames(). A
1eb40 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e  s well as loggin
1eb50 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
1eb60 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66  s of the list of
1eb70 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79   pages headed by
1eb80 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65   pList (connecte
1eb90 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a  d by pDirty),.**
1eba0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
1ebb0 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69  otifies any acti
1ebc0 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ve backup proces
1ebd0 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ses that the pag
1ebe0 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67  es have.** chang
1ebf0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ed. .**.** The l
1ec00 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73  ist of pages pas
1ec10 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f  sed into this ro
1ec20 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20  utine is always 
1ec30 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e  sorted by page n
1ec40 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c  umber..** Hence,
1ec50 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61   if page 1 appea
1ec60 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  rs anywhere on t
1ec70 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c  he list, it will
1ec80 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61   be the first pa
1ec90 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ge..*/ .static i
1eca0 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  nt pagerWalFrame
1ecb0 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
1ecc0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1ecd0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1ece0 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ject */.  PgHdr 
1ecf0 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
1ed00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1ed10 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c  t of frames to l
1ed20 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72  og */.  Pgno nTr
1ed30 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1ed40 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1ed50 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ase size after t
1ed60 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  his commit */.  
1ed70 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed90 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1eda0 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29  is a commit */.)
1edb0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1ede0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73  de */.  int nLis
1edf0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1ee00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ee10 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c  r of pages in pL
1ee20 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ist */.  PgHdr *
1ee30 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1ee40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1ee50 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67  looping over pag
1ee60 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
1ee70 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b   pPager->pWal );
1ee80 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1ee90 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1eea0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
1eeb0 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
1eec0 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63  e list is in acc
1eed0 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
1eee0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1eef0 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70   && p->pDirty; p
1ef00 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1ef10 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f   assert( p->pgno
1ef20 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67   < p->pDirty->pg
1ef30 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  no );.  }.#endif
1ef40 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ..  assert( pLis
1ef50 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20  t->pDirty==0 || 
1ef60 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66  isCommit );.  if
1ef70 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ( isCommit ){.  
1ef80 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72    /* If a WAL tr
1ef90 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
1efa0 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  ng committed, th
1efb0 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
1efc0 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a  in writing.    *
1efd0 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68  * any pages with
1efe0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1eff0 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e  eater than nTrun
1f000 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41  cate into the WA
1f010 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54  L file..    ** T
1f020 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hey will never b
1f030 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c  e read by any cl
1f040 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20  ient. So remove 
1f050 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44  them from the pD
1f060 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74  irty.    ** list
1f070 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67   here. */.    Pg
1f080 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26  Hdr **ppNext = &
1f090 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74  pList;.    nList
1f0a0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d   = 0;.    for(p=
1f0b0 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20  pList; (*ppNext 
1f0c0 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44  = p)!=0; p=p->pD
1f0d0 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28  irty){.      if(
1f0e0 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63   p->pgno<=nTrunc
1f0f0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
1f100 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72  pNext = &p->pDir
1f110 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73  ty;.        nLis
1f120 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
1f130 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1f140 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
1f150 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a  .    nList = 1;.
1f160 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53    }.  pPager->aS
1f170 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
1f180 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a  RITE] += nList;.
1f190 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67  .  if( pList->pg
1f1a0 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
1f1b0 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
1f1c0 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d  r(pList);.  rc =
1f1d0 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1f1e0 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  s(pPager->pWal, 
1f1f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
1f200 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20  ageSize, pList, 
1f210 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d  nTruncate, isCom
1f220 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c  mit, pPager->wal
1f230 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20  SyncFlags.  );. 
1f240 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f250 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42  OK && pPager->pB
1f260 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72  ackup ){.    for
1f270 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1f280 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1f290 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
1f2a0 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
1f2b0 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
1f2c0 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
1f2d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
1f2e0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1f2f0 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73  AGES.  pList = s
1f300 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1f310 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1f320 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Cache);.  for(p=
1f330 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1f340 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65  Dirty){.    page
1f350 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
1f360 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1f370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f380 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61  *.** Begin a rea
1f390 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d transaction on
1f3a0 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20   the WAL..**.** 
1f3b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1f3c0 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22  d to be called "
1f3d0 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f  pagerOpenSnapsho
1f3e0 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20  t()" because it 
1f3f0 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d  essentially.** m
1f400 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20  akes a snapshot 
1f410 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f420 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
1f430 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64  oint in time and
1f440 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68   preserves.** th
1f450 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20  at snapshot for 
1f460 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65  use by the reade
1f470 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f  r in spite of co
1f480 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67  ncurrently chang
1f490 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77  es by.** other w
1f4a0 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70  riters or checkp
1f4b0 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
1f4c0 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69  ic int pagerBegi
1f4d0 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1f4e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f4f0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f510 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1f520 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67  e */.  int chang
1f530 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
1f540 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1f550 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  f cache must be 
1f560 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  reset */..  asse
1f570 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1f580 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
1f590 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f5a0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f5b0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1f5c0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
1f5d0 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  );..  /* sqlite3
1f5e0 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1f5f0 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20  ction() was not 
1f600 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70  called for the p
1f610 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61  revious.  ** tra
1f620 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b  nsaction in lock
1f630 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
1f640 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20  VE.  So call it 
1f650 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a  now.  If we.  **
1f660 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f   are in locking_
1f670 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20  mode=NORMAL and 
1f680 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72  EndRead() was pr
1f690 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c  eviously called,
1f6a0 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63  .  ** the duplic
1f6b0 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d  ate call is harm
1f6c0 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  less..  */.  sql
1f6d0 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
1f6e0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1f6f0 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d  ->pWal);..  rc =
1f700 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
1f710 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1f720 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63  pPager->pWal, &c
1f730 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72  hanged);.  if( r
1f740 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1f750 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70  changed ){.    p
1f760 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1f770 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46  r);.    if( USEF
1f780 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73  ETCH(pPager) ) s
1f790 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
1f7a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
1f7b0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1f7c0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
1f7d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1f7e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
1f7f0 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  part of the tran
1f800 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45  sition from PAGE
1f810 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47  R_OPEN.** to PAG
1f820 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20  ER_READER state 
1f830 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1f840 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1f850 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e  abase file.** in
1f860 20 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67   pages (assuming
1f870 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63   the page size c
1f880 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
1f890 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  in Pager.pageSiz
1f8a0 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  e)..**.** If no 
1f8b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
1f8c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1f8d0 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65  ned and the size
1f8e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f8f0 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20  .** in pages is 
1f900 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67  stored in *pnPag
1f910 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  e. Otherwise, an
1f920 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72   error code (per
1f930 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  haps.** SQLITE_I
1f940 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72  OERR_FSTAT) is r
1f950 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50  eturned and *pnP
1f960 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  age is left unmo
1f970 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  dified..*/.stati
1f980 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63  c int pagerPagec
1f990 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
1f9a0 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65  er, Pgno *pnPage
1f9b0 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  ){.  Pgno nPage;
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9d0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
1f9e0 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50   return via *pnP
1f9f0 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65  age */..  /* Que
1fa00 72 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  ry the WAL sub-s
1fa10 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61  ystem for the da
1fa20 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65  tabase size. The
1fa30 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a   WalDbsize().  *
1fa40 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
1fa50 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57  ns zero if the W
1fa60 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28  AL is not open (
1fa70 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d  i.e. Pager.pWal=
1fa80 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20  =0), or.  ** if 
1fa90 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1faa0 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
1fab0 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  le. The database
1fac0 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a   size is not.  *
1fad0 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  * available from
1fae0 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1faf0 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66  tem if the log f
1fb00 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a  ile is empty or.
1fb10 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
1fb20 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64   valid committed
1fb30 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20   transactions.. 
1fb40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1fb50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1fb60 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1fb70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1fb80 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1fb90 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71   );.  nPage = sq
1fba0 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70  lite3WalDbsize(p
1fbb0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1fbc0 20 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   /* If the numbe
1fbd0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1fbe0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1fbf0 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
1fc00 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75   the.  ** WAL su
1fc10 62 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d  b-system, determ
1fc20 69 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75  ine the page cou
1fc30 6e 74 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  nte based on the
1fc40 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68   size of.  ** th
1fc50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1fc60 20 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66    If the size of
1fc70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fc80 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a  le is not an.  *
1fc90 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  * integer multip
1fca0 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
1fcb0 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68  ize, round up th
1fcc0 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20  e result..  */. 
1fcd0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1fce0 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd00 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
1fd10 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1fd20 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
1fd30 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1fd40 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1fd50 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1fd60 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1fd70 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  d) ){.      int 
1fd80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1fd90 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1fda0 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66  d, &n);.      if
1fdb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fdc0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1fdd0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1fde0 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
1fdf0 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
1fe00 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
1fe10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fe20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1fe30 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
1fe40 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1fe50 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
1fe60 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
1fe70 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
1fe80 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
1fe90 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
1fea0 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
1feb0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
1fec0 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
1fed0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1fee0 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
1fef0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
1ff00 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
1ff10 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
1ff20 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
1ff30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ff40 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1ff50 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1ff60 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
1ff70 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
1ff80 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
1ff90 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
1ffa0 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
1ffb0 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
1ffc0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
1ffd0 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
1ffe0 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
1fff0 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
20000 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
20010 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
20020 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
20030 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
20040 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20050 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
20060 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
20070 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
20080 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
20090 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
200a0 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
200b0 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
200c0 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
200d0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
200e0 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
200f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
20100 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
20110 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
20120 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
20130 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
20140 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
20150 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
20160 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
20170 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20180 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
20190 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
201a0 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
201b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
201c0 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
201d0 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
201e0 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
201f0 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
20200 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
20210 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
20220 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
20230 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
20240 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
20250 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
20260 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
20270 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
20280 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
20290 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
202a0 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
202b0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
202c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
202d0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
202e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
202f0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
20300 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20310 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
20320 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
20330 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20340 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
20350 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
20360 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20370 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
20380 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   */.    Pgno nPa
20390 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
203a0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
203b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
203c0 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
203d0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
203e0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
203f0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
20400 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
20410 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
20420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20430 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
20440 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
20450 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  l, 0);.      if(
20460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
20470 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29  R_DELETE_NOENT )
20480 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20490 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30  .      isWal = 0
204a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
204b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
204c0 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
204d0 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c     pPager->pVfs,
204e0 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53   pPager->zWal, S
204f0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
20500 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20  STS, &isWal.    
20510 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
20520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20530 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
20540 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Wal ){.        t
20550 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
20560 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
20570 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
20580 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
20590 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
205a0 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20  OpenWal(pPager, 
205b0 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
205c0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
205d0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
205e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
205f0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
20600 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
20610 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20620 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
20630 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
20640 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
20650 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
20660 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
20670 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
20680 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
20690 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
206a0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
206b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
206c0 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
206d0 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
206e0 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
206f0 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
20700 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
20710 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
20720 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
20730 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
20740 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
20750 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
20760 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
20770 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
20780 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
20790 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
207a0 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
207b0 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
207c0 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
207d0 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
207e0 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
207f0 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
20800 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
20810 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
20820 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20830 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
20840 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
20850 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
20860 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
20870 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
20880 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20890 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
208a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
208b0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
208c0 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
208d0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
208e0 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
208f0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
20900 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20910 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
20920 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
20930 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
20940 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
20950 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
20960 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
20970 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
20980 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
20990 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
209a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
209b0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
209c0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
209d0 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
209e0 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
209f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
20a00 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
20a10 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
20a20 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
20a30 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
20a40 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
20a50 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
20a60 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
20a70 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
20a80 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
20a90 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
20aa0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
20ab0 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
20ac0 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
20ad0 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
20ae0 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
20af0 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
20b00 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20b10 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
20b20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
20b30 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
20b40 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
20b50 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
20b60 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
20b70 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
20b80 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
20b90 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
20ba0 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
20bb0 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
20bc0 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
20bd0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
20be0 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
20bf0 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
20c00 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
20c10 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
20c20 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
20c30 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
20c40 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
20c50 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
20c60 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
20c70 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
20c80 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
20c90 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
20ca0 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
20cb0 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
20cc0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
20cd0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
20ce0 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
20cf0 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
20d00 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
20d10 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
20d20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20d30 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
20d40 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
20d50 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
20d60 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
20d70 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d90 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
20da0 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
20db0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
20dc0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
20dd0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
20de0 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
20df0 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
20e00 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
20e10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
20e20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
20e30 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
20e40 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
20e50 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
20e60 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
20e70 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
20e80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
20e90 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
20ea0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
20eb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
20ec0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
20ed0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20  ER_LOCKED );..  
20ee0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
20ef0 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
20f00 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
20f10 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
20f20 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
20f30 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
20f40 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
20f50 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
20f60 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
20f70 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
20f80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20f90 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
20fa0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
20fb0 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
20fc0 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
20fd0 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
20fe0 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
20ff0 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
21000 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
21010 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
21020 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
21030 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
21040 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
21050 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
21060 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
21070 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
21080 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
21090 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e    if( !pSavepoin
210a0 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  t && pagerUseWal
210b0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
210c0 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c  return pagerRoll
210d0 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b  backWal(pPager);
210e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70  .  }..  /* Use p
210f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21100 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69  f as the effecti
21110 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
21120 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
21130 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  * journal.  The 
21140 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68  actual file migh
21150 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  t be larger than
21160 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41   this in.  ** PA
21170 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21180 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45  TRUNCATE or PAGE
21190 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
211a0 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74  RSIST.  But anyt
211b0 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70  hing.  ** past p
211c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
211d0 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20  f is off-limits 
211e0 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a  to us..  */.  sz
211f0 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
21200 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  nalOff;.  assert
21210 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
21220 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d  ager)==0 || szJ=
21230 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
21240 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63  n by rolling bac
21250 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  k records from t
21260 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21270 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
21280 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21290 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
212a0 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inuing to the ne
212b0 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
212c0 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69  r..  ** There mi
212d0 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69  ght be records i
212e0 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
212f0 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70  al that have a p
21300 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
21310 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
21320 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
21330 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e  e size (pPager->
21340 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73  dbSize) but thos
21350 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  e.  ** will be s
21360 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63  kipped automatic
21370 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65  ally.  Pages are
21380 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20   added to pDone 
21390 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65  as they.  ** are
213a0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
213b0 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
213c0 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65  int && !pagerUse
213d0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
213e0 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61     iHdrOff = pSa
213f0 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
21400 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  set ? pSavepoint
21410 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73  ->iHdrOffset : s
21420 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  zJ;.    pPager->
21430 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61  journalOff = pSa
21440 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74  vepoint->iOffset
21450 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
21460 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
21470 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21480 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  <iHdrOff ){.    
21490 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
214a0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
214b0 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
214c0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
214d0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
214e0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
214f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
21510 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
21520 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
21530 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
21540 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
21550 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21560 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
21570 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
21580 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
21590 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
215a0 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
215b0 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
215c0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
215d0 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
215e0 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
215f0 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
21600 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
21610 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
21620 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
21630 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
21640 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21650 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
21660 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
21670 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
21680 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
21690 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
216a0 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
216b0 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
216c0 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
216d0 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
216e0 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
216f0 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73  Hdr(pPager, 0, s
21700 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
21710 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
21720 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
21730 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
21740 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
21750 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
21760 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
21770 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
21780 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
21790 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
217a0 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
217b0 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
217c0 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
217d0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
217e0 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
217f0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
21800 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
21810 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
21820 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
21830 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
21840 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
21850 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
21860 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
21870 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
21880 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
21890 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
218a0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
218b0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
218c0 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
218d0 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
218e0 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
218f0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
21900 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
21910 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
21920 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
21930 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21940 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
21950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21960 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21970 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ONE );.  }.  ass
21980 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21990 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
219a0 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b  urnalOff>=szJ );
219b0 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
219c0 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
219d0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
219e0 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
219f0 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
21a00 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
21a10 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
21a20 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
21a30 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
21a40 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
21a50 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
21a60 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
21a70 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
21a80 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
21a90 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20  oint ){.    u32 
21aa0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
21ab0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
21ac0 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  /.    i64 offset
21ad0 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69   = (i64)pSavepoi
21ae0 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
21af0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21b00 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
21b10 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21b20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
21b30 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74  ite3WalSavepoint
21b40 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
21b50 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61  l, pSavepoint->a
21b60 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  WalData);.    }.
21b70 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
21b80 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
21b90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21ba0 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
21bb0 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
21bc0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
21bd0 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61  ==(i64)ii*(4+pPa
21be0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
21bf0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
21c00 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21c10 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66  page(pPager, &of
21c20 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20  fset, pDone, 0, 
21c30 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
21c40 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21c50 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
21c60 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
21c70 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
21c80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21c90 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21ca0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
21cb0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
21cc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
21cd0 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
21ce0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
21cf0 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
21d00 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
21d10 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
21d20 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e  to recycle clean
21d30 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65   and unused page
21d40 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
21d50 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
21d60 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
21d70 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
21d80 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
21d90 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
21da0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
21db0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  age);.}../*.** C
21dc0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
21dd0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
21de0 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
21df0 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   are allowed.** 
21e00 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
21e10 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73  g to spill pages
21e20 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a   to journal..*/.
21e30 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21e40 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67  SetSpillsize(Pag
21e50 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
21e60 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  mxPage){.  retur
21e70 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  n sqlite3PcacheS
21e80 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67  etSpillsize(pPag
21e90 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
21ea0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  age);.}../*.** I
21eb0 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e  nvoke SQLITE_FCN
21ec0 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73  TL_MMAP_SIZE bas
21ed0 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
21ee0 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61  t value of szMma
21ef0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
21f00 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d  d pagerFixMaplim
21f10 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
21f20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
21f30 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
21f40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
21f50 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20   = pPager->fd;. 
21f60 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20   if( isOpen(fd) 
21f70 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  && fd->pMethods-
21f80 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a  >iVersion>=3 ){.
21f90 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
21fa0 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70  4 sz;.    sz = p
21fb0 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20  Pager->szMmap;. 
21fc0 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46     pPager->bUseF
21fd0 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20  etch = (sz>0);. 
21fe0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
21ff0 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
22000 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
22010 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
22020 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  &sz);.  }.#endif
22030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
22040 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
22050 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20  e of any memory 
22060 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20  mapping made of 
22070 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22080 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
22090 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
220a0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
220b0 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
220c0 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67   szMmap){.  pPag
220d0 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d  er->szMmap = szM
220e0 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d  map;.  pagerFixM
220f0 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
22100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
22110 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
22120 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74   possible from t
22130 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69  he pager..*/.voi
22140 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  d sqlite3PagerSh
22150 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67  rink(Pager *pPag
22160 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
22170 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65  acheShrink(pPage
22180 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
22190 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74  /*.** Adjust set
221a0 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  tings of the pag
221b0 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  er to those spec
221c0 69 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46  ified in the pgF
221d0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a  lags parameter..
221e0 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c  **.** The "level
221f0 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50  " in pgFlags & P
22200 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
22210 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72  _MASK sets the r
22220 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20  obustness.** of 
22230 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
22240 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
22250 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65   crashes or powe
22260 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a  r failures by.**
22270 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
22280 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
22290 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68   when writing th
222a0 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  e journals..** T
222b0 68 65 72 65 20 61 72 65 20 66 6f 75 72 20 6c 65  here are four le
222c0 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
222d0 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
222e0 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
222f0 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
22300 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
22310 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
22320 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
22330 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
22340 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
22350 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
22360 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
22370 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
22380 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
22390 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
223a0 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
223b0 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
223c0 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
223d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
223e0 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
223f0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
22400 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
22410 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
22420 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
22430 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
22440 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
22450 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
22460 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
22470 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
22480 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
22490 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
224a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
224b0 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
224c0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
224d0 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
224e0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
224f0 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
22500 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
22510 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
22520 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
22530 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
22540 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
22550 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
22560 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
22570 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
22580 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
22590 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
225a0 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
225b0 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
225c0 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
225d0 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
225f0 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
22600 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
22610 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
22620 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
22630 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
22640 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
22650 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
22660 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
22670 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
22680 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
22690 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
226a0 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
226b0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54  ck..**.**    EXT
226c0 52 41 20 20 20 20 20 54 68 69 73 20 69 73 20 6c  RA     This is l
226d0 69 6b 65 20 46 55 4c 4c 20 65 78 63 65 70 74 20  ike FULL except 
226e0 74 68 61 74 20 69 73 20 61 6c 73 6f 20 73 79 6e  that is also syn
226f0 63 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  cs the directory
22700 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22710 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
22720 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
22730 6e 61 6c 20 61 66 74 65 72 20 74 68 65 20 72 6f  nal after the ro
22740 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20  llback.**       
22750 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69         journal i
22760 73 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a  s unlinked..**.*
22770 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66  * The above is f
22780 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  or a rollback-jo
22790 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72  urnal mode.  For
227a0 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63   WAL mode, OFF c
227b0 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d  ontinues.** to m
227c0 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63  ean that no sync
227d0 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e  s ever occur.  N
227e0 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74  ORMAL means that
227f0 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63   the WAL is sync
22800 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74  ed.** prior to t
22810 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63  he start of chec
22820 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20  kpoint and that 
22830 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22840 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61  e is synced.** a
22850 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
22860 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
22870 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  nt if the entire
22880 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
22890 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74  WAL.** was writt
228a0 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
228b0 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20   database.  But 
228c0 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f  no sync operatio
228d0 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20  ns occur for.** 
228e0 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d  an ordinary comm
228f0 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64  it in NORMAL mod
22900 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c  e with WAL.  FUL
22910 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
22920 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20   WAL.** file is 
22930 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
22940 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65   each commit ope
22950 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74  ration, in addit
22960 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79  ion to the.** sy
22970 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ncs associated w
22980 69 74 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65  ith NORMAL.  The
22990 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65  re is no differe
229a0 6e 63 65 20 62 65 74 77 65 65 6e 20 46 55 4c 4c  nce between FULL
229b0 0a 2a 2a 20 61 6e 64 20 45 58 54 52 41 20 66 6f  .** and EXTRA fo
229c0 72 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  r WAL mode..**.*
229d0 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65  * Do not confuse
229e0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
229f0 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59  L with SQLITE_SY
22a00 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a  NC_FULL.  The.**
22a10 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22a20 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f  L macro means to
22a30 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d   use the MacOSX-
22a40 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63  style full-fsync
22a50 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  .** using fcntl(
22a60 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53  F_FULLFSYNC).  S
22a70 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22a80 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e  L means to do an
22a90 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79  .** ordinary fsy
22aa0 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72  nc() call.  Ther
22ab0 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
22ac0 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54  ce between SQLIT
22ad0 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61  E_SYNC_FULL.** a
22ae0 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  nd SQLITE_SYNC_N
22af0 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72  ORMAL on platfor
22b00 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61  ms other than Ma
22b10 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a  cOSX.  But the.*
22b20 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  * synchronous=FU
22b30 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72  LL versus synchr
22b40 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74  onous=NORMAL set
22b50 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20  ting determines 
22b60 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e  when.** the xSyn
22b70 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63  c primitive is c
22b80 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c  alled and is rel
22b90 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61  evant to all pla
22ba0 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75  tforms..**.** Nu
22bb0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
22bc0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22bd0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
22be0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
22bf0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
22c00 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22c10 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
22c20 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
22c30 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20  PagerSetFlags(. 
22c40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
22c50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
22c60 67 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74  ger to set safet
22c70 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20  y level for */. 
22c80 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
22c90 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75  s      /* Variou
22ca0 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  s flags */.){.  
22cb0 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d  unsigned level =
22cc0 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
22cd0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
22ce0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
22cf0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
22d00 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
22d10 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
22d20 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20  >fullSync = 0;. 
22d30 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61     pPager->extra
22d40 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
22d50 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  e{.    pPager->n
22d60 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
22d70 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
22d80 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20  S_OFF ?1:0;.    
22d90 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
22da0 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f   = level>=PAGER_
22db0 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c  SYNCHRONOUS_FULL
22dc0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65   ?1:0;.    pPage
22dd0 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 6c  r->extraSync = l
22de0 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43  evel==PAGER_SYNC
22df0 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31  HRONOUS_EXTRA ?1
22e00 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  :0;.  }.  if( pP
22e10 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
22e20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
22e30 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70  Flags = 0;.    p
22e40 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
22e50 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lags = 0;.  }els
22e60 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20  e if( pgFlags & 
22e70 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20  PAGER_FULLFSYNC 
22e80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
22e90 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
22ea0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20  E_SYNC_FULL;.   
22eb0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
22ec0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22ed0 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c  SYNC_FULL;.  }el
22ee0 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26  se if( pgFlags &
22ef0 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c   PAGER_CKPT_FULL
22f00 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61  FSYNC ){.    pPa
22f10 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
22f20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
22f30 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
22f40 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
22f50 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22f60 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
22f70 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22f80 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22f90 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
22fa0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
22fb0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22fc0 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50  NORMAL;.  }.  pP
22fd0 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
22fe0 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e  gs = pPager->syn
22ff0 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50  cFlags;.  if( pP
23000 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
23010 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  {.    pPager->wa
23020 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41  lSyncFlags |= WA
23030 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49  L_SYNC_TRANSACTI
23040 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONS;.  }.  if( p
23050 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43  gFlags & PAGER_C
23060 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20  ACHESPILL ){.   
23070 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
23080 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41  ill &= ~SPILLFLA
23090 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a  G_OFF;.  }else{.
230a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
230b0 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46  tSpill |= SPILLF
230c0 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23  LAG_OFF;.  }.}.#
230d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
230e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
230f0 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
23100 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
23110 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
23120 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
23130 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
23140 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
23150 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
23160 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
23170 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
23180 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
23190 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
231a0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
231b0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
231c0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
231d0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
231e0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
231f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
23200 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
23210 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
23220 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
23230 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
23240 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
23250 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
23260 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
23270 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
23280 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
23290 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
232a0 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
232b0 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
232c0 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
232d0 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
232e0 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
232f0 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
23300 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
23310 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
23320 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23330 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
23340 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
23350 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
23360 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
23370 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
23380 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
23390 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
233a0 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
233b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
233c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
233d0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
233e0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
233f0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
23400 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
23410 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
23420 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
23430 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
23440 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
23450 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
23460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23470 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
23480 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
23490 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
234a0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
234b0 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
234c0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
234d0 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
234e0 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
234f0 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
23500 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
23510 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
23520 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
23530 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
23540 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
23550 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
23560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
23570 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
23580 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
23590 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
235a0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
235b0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
235c0 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
235d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
235e0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
235f0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
23600 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
23610 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
23620 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
23630 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
23640 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
23650 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
23660 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
23670 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
23680 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
23690 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
236a0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
236b0 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
236c0 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
236d0 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
236e0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
236f0 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
23700 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
23710 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
23720 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
23730 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
23740 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
23750 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
23760 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
23770 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
23780 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
23790 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
237b0 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
237c0 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
237d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
237e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
237f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23800 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
23810 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
23820 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
23830 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
23840 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
23850 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
23860 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
23870 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
23880 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
23890 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
238a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
238b0 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
238c0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
238d0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
238e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
238f0 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
23900 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
23910 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
23920 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
23930 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
23940 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
23950 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
23960 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
23970 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
23980 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
23990 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239b0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
239c0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
239d0 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
239e0 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
239f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
23a00 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
23a10 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
23a20 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23a40 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
23a50 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
23a60 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72  r */.){.  pPager
23a70 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
23a80 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
23a90 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
23aa0 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
23ab0 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69  HandlerArg;..  i
23ac0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
23ad0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69  ->fd) ){.    voi
23ae0 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a  d **ap = (void *
23af0 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79  *)&pPager->xBusy
23b00 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73  Handler;.    ass
23b10 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f  ert( ((int(*)(vo
23b20 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d  id *))(ap[0]))==
23b30 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a  xBusyHandler );.
23b40 20 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31      assert( ap[1
23b50 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41  ]==pBusyHandlerA
23b60 72 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rg );.    sqlite
23b70 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
23b80 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
23b90 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59  QLITE_FCNTL_BUSY
23ba0 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a  HANDLER, (void *
23bb0 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  )ap);.  }.}../*.
23bc0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  ** Change the pa
23bd0 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
23be0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
23bf0 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73  . The new page s
23c00 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65  ize .** is passe
23c10 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e  d in *pPageSize.
23c20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
23c30 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
23c40 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
23c50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
23c60 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73  called, it.** is
23c70 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61   a no-op. The va
23c80 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
23c90 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
23ca0 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e  error code (i.e.
23cb0 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49   .** one of SQLI
23cc0 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c  TE_IOERR, an SQL
23cd0 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75  ITE_IOERR_xxx su
23ce0 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45  b-code or SQLITE
23cf0 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  _FULL)..**.** Ot
23d00 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
23d10 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
23d20 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
23d30 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67     * the new pag
23d40 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66  e size (value of
23d50 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20   *pPageSize) is 
23d60 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a  valid (a power .
23d70 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65  **     of two be
23d80 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51  tween 512 and SQ
23d90 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
23da0 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20  ZE, inclusive), 
23db0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
23dc0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
23dd0 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
23de0 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  rences, and.**.*
23df0 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
23e00 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74  se is either not
23e10 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
23e20 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a  tabase or it is.
23e30 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d  **     an in-mem
23e40 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ory database tha
23e50 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  t currently cons
23e60 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67  ists of zero pag
23e70 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74  es..**.** then t
23e80 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
23e90 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74  page size is set
23ea0 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   to *pPageSize..
23eb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
23ec0 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65  e size is change
23ed0 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  d, then this fun
23ee0 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74  ction uses sqlit
23ef0 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20  e3PagerMalloc() 
23f00 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
23f10 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70  new Pager.pTmpSp
23f20 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74  ace buffer. If t
23f30 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  his allocation a
23f40 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73  ttempt .** fails
23f50 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
23f60 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
23f70 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d  he page size rem
23f80 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  ains unchanged. 
23f90 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72  .** In all other
23fa0 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f   cases, SQLITE_O
23fb0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
23fc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
23fd0 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61   size is not cha
23fe0 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63  nged, either bec
23ff0 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  ause one of the 
24000 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f  enumerated.** co
24010 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69  nditions above i
24020 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20  s not true, the 
24030 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72  pager was in err
24040 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
24050 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
24060 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65  as called, or be
24070 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  cause the memory
24080 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
24090 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20  mpt failed, .** 
240a0 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20  then *pPageSize 
240b0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c  is set to the ol
240c0 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65  d, retained page
240d0 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74   size before ret
240e0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
240f0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
24100 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
24110 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65  ager, u32 *pPage
24120 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
24130 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
24140 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
24150 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
24160 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c  ble to do a full
24170 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
24180 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74  ate() here, as t
24190 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
241a0 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
241b0 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65  from within Page
241c0 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20  rOpen(), before 
241d0 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f  the state.  ** o
241e0 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
241f0 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79  ct is internally
24200 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a   consistent..  *
24210 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f  *.  ** At one po
24220 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  int this functio
24230 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  n returned an er
24240 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72  ror if the pager
24250 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41   was in .  ** PA
24260 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
24270 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52   But since PAGER
24280 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61  _ERROR state gua
24290 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a  rantees that.  *
242a0 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65  * there is at le
242b0 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
242c0 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
242d0 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ce, this functio
242e0 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  n.  ** is a no-o
242f0 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20  p for that case 
24300 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20  anyhow..  */..  
24310 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u32 pageSize = *
24320 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  pPageSize;.  ass
24330 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
24340 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
24350 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
24360 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
24370 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28  SIZE) );.  if( (
24380 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
24390 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
243a0 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c  ze==0).   && sql
243b0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
243c0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
243d0 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61  he)==0 .   && pa
243e0 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
243f0 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d  ze!=(u32)pPager-
24400 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a  >pageSize .  ){.
24410 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
24420 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20   NULL;          
24430 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73     /* New temp s
24440 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20  pace */.    i64 
24450 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20  nByte = 0;..    
24460 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
24470 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  te>PAGER_OPEN &&
24480 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
24490 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  fd) ){.      rc 
244a0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
244b0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
244c0 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20  &nByte);.    }. 
244d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
244e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e  E_OK ){.      pN
244f0 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
24500 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
24510 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
24520 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d  if( !pNew ) rc =
24530 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
24540 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
24550 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24560 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
24570 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
24580 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24590 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
245a0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
245b0 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
245c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
245d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
245e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
245f0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
24600 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
24610 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
24620 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50  = pNew;.      pP
24630 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
24640 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67  Pgno)((nByte+pag
24650 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a  eSize-1)/pageSiz
24660 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
24670 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
24680 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  eSize;.    }else
24690 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
246a0 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  ageFree(pNew);. 
246b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61     }.  }..  *pPa
246c0 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
246d0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28  >pageSize;.  if(
246e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
246f0 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72  {.    if( nReser
24700 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20  ve<0 ) nReserve 
24710 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  = pPager->nReser
24720 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
24730 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
24740 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a  Reserve<1000 );.
24750 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
24760 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73  erve = (i16)nRes
24770 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
24780 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
24790 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d  );.    pagerFixM
247a0 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
247b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
247c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
247d0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
247e0 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
247f0 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
24800 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
24810 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
24820 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
24830 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
24840 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
24850 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
24860 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
24870 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
24880 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
24890 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
248a0 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
248b0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
248c0 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
248d0 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
248e0 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
248f0 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
24900 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
24910 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
24920 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
24930 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
24940 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
24950 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24960 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
24970 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
24980 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
24990 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
249a0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
249b0 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
249c0 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
249d0 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
249e0 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
249f0 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
24a00 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
24a10 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
24a20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
24a30 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
24a40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
24a50 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
24a60 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
24a70 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
24a80 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
24a90 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
24aa0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
24ab0 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
24ac0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
24ad0 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
24ae0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24af0 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
24b00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
24b10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
24b20 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20  AGER_OPEN );    
24b30 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79    /* Called only
24b40 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   by OP_MaxPgcnt 
24b50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
24b60 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61  ger->mxPgno>=pPa
24b70 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20  ger->dbSize );  
24b80 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65  /* OP_MaxPgcnt e
24b90 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a  nforces this */.
24ba0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
24bb0 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
24bc0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24bd0 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
24be0 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
24bf0 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
24c00 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
24c10 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
24c20 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
24c30 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
24c40 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
24c50 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
24c60 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
24c70 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
24c80 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
24c90 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
24ca0 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
24cb0 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
24cc0 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
24cd0 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
24ce0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
24cf0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
24d00 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
24d10 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
24d20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24d30 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
24d40 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
24d50 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
24d60 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
24d70 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
24d80 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
24d90 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
24da0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
24db0 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
24dc0 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
24dd0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
24de0 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
24df0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
24e00 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
24e10 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
24e20 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
24e30 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
24e40 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
24e50 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24e60 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
24e70 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
24e80 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
24e90 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
24ea0 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
24eb0 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
24ec0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
24ed0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
24ee0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
24ef0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28  transient file (
24f00 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20  zFilename==""), 
24f10 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20  or.** opened on 
24f20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e  a file less than
24f30 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   N bytes in size
24f40 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  , the output buf
24f50 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64  fer is.** zeroed
24f60 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
24f70 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74  eturned. The rat
24f80 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20  ionale for this 
24f90 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a  is that this .**
24fa0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
24fb0 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  d to read databa
24fc0 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20  se headers, and 
24fd0 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20  a new transient 
24fe0 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64  or.** zero sized
24ff0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20   database has a 
25000 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73  header than cons
25010 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
25020 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   zeroes..**.** I
25030 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61  f any IO error a
25040 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  part from SQLITE
25050 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
25060 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  D is encountered
25070 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63  ,.** the error c
25080 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
25090 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e  to the caller an
250a0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
250b0 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
250c0 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64  buffer undefined
250d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
250e0 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
250f0 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
25100 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
25110 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
25120 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25130 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
25140 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
25150 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
25160 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
25170 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
25180 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
25190 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
251a0 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d  led by btree imm
251b0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63  ediately after c
251c0 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
251d0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20   Pager object.  
251e0 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65  There has not be
251f0 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  en an opportunit
25200 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a  y to transition.
25210 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65    ** to WAL mode
25220 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   yet..  */.  ass
25230 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
25240 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
25250 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
25260 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
25270 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
25280 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
25290 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
252a0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
252b0 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
252c0 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
252d0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
252e0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
252f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25300 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
25310 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25320 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
25330 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
25340 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64  lled when a read
25350 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
25360 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  open on.** the p
25370 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73  ager. It returns
25380 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
25390 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
253a0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
253b0 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
253c0 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
253d0 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
253e0 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
253f0 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
25400 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
25410 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f   1 page file..*/
25420 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
25430 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
25440 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
25450 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  pnPage){.  asser
25460 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
25470 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
25480 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
25490 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
254a0 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
254b0 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20  ED );.  *pnPage 
254c0 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64  = (int)pPager->d
254d0 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  bSize;.}.../*.**
254e0 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
254f0 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
25500 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
25510 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
25520 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
25530 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
25540 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
25550 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
25560 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
25570 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
25580 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
25590 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
255a0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
255b0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
255c0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
255d0 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
255e0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
255f0 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
25600 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
25610 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
25620 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
25630 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
25640 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
25650 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
25660 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
25670 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
25680 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
25690 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
256a0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
256b0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
256c0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
256d0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
256e0 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
256f0 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
25700 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
25710 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
25720 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
25730 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
25740 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
25750 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
25760 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
25770 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
25780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
257a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
257b0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
257c0 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
257d0 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
257e0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
257f0 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
25800 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65  dy held), or one
25810 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
25820 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
25830 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
25840 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
25850 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
25860 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
25870 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
25880 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
25890 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
258a0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
258b0 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29  eLock>=locktype)
258c0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
258d0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
258e0 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
258f0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
25900 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
25910 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
25920 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
25930 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
25940 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  ).  );..  do {. 
25950 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
25960 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b  kDb(pPager, lock
25970 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
25980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
25990 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
259a0 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
259b0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
259c0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
259d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
259e0 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61  ion assertTrunca
259f0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
25a00 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74  ger) checks that
25a10 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
25a20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
25a30 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20  e for all dirty 
25a40 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
25a50 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
25a60 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68  e:.**.**   a) Th
25a70 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
25a80 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
25a90 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
25aa0 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
25ab0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
25ac0 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73   image, in pages
25ad0 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  , OR.**.**   b) 
25ae0 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  if the page cont
25af0 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e  ent were written
25b00 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69   at this time, i
25b10 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20  t would not.**  
25b20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79      be necessary
25b30 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
25b40 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75  rrent content ou
25b50 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  t to the sub-jou
25b60 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73  rnal.**      (as
25b70 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66   determined by f
25b80 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75  unction subjRequ
25b90 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a  iresPage())..**.
25ba0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74  ** If the condit
25bb0 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20  ion asserted by 
25bc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65  this function we
25bd0 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
25be0 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
25bf0 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69  ge were to be di
25c00 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65  scarded from the
25c10 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70   cache via the p
25c20 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
25c30 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74  routine, pagerSt
25c40 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74  ress() would not
25c50 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
25c60 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
25c70 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
25c80 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61  se file. If a sa
25c90 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
25ca0 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20  ion were rolled 
25cb0 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68  back after.** th
25cc0 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65  is happened, the
25cd0 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
25ce0 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
25cf0 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
25d00 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
25d10 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
25d20 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
25d30 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
25d40 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
25d50 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
25d60 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
25d70 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
25d80 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
25d90 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
25da0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
25db0 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
25dc0 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
25dd0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
25de0 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
25df0 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
25e00 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
25e10 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
25e20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
25e30 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
25e40 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
25e50 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
25e60 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
25e70 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25e80 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
25e90 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
25ea0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
25eb0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
25ec0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
25ed0 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
25ee0 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
25ef0 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
25f00 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
25f10 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25f20 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
25f30 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
25f40 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
25f50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
25f60 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25f70 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
25f80 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
25f90 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25fa0 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
25fb0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
25fc0 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
25fd0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
25fe0 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
25ff0 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
26000 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
26010 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
26020 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
26030 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
26040 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
26050 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
26060 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
26070 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
26080 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
26090 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
260a0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
260b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
260c0 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
260d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
260e0 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74  nly called right
260f0 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
26100 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
26110 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66  ..** Once this f
26120 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  unction has been
26130 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61   called, the tra
26140 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69  nsaction must ei
26150 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65  ther be.** rolle
26160 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  d back or commit
26170 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73  ted. It is not s
26180 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  afe to call this
26190 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a   function and.**
261a0 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77   then continue w
261b0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
261c0 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  tabase..*/.void 
261d0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
261e0 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
261f0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
26200 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
26210 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
26220 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
26230 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
26240 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
26250 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
26260 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
26270 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f  Page;..  /* At o
26280 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64  ne point the cod
26290 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73  e here called as
262a0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
262b0 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a  traint() to.  **
262c0 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   ensure that all
262d0 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75   pages being tru
262e0 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74  ncated away by t
262f0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72  his operation ar
26300 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f  e,.  ** if one o
26310 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
26320 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73  s are open, pres
26330 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70  ent in the savep
26340 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  oint .  ** journ
26350 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  al so that they 
26360 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
26370 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  if the savepoint
26380 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20   is rolled.  ** 
26390 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f  back. This is no
263a0 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72   longer necessar
263b0 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  y as this functi
263c0 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20  on is now only. 
263d0 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74   ** called right
263e0 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
263f0 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
26400 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68  . So although th
26410 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62  e .  ** Pager ob
26420 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68  ject may still h
26430 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ave open savepoi
26440 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65  nts (Pager.nSave
26450 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a  point!=0), .  **
26460 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20   they cannot be 
26470 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20  rolled back. So 
26480 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  the assertTrunca
26490 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63  teConstraint() c
264a0 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c  all.  ** is no l
264b0 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a  onger correct. *
264c0 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.}.../*.** This
264d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
264e0 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  led before attem
264f0 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  pting a hot-jour
26500 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74  nal rollback. It
26510 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f  .** syncs the jo
26520 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69  urnal file to di
26530 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50  sk, then sets pP
26540 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
26550 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20   to the.** size 
26560 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
26570 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ile so that the 
26580 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
26590 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a   routine knows.*
265a0 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  * that the entir
265b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
265c0 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  as been synced..
265d0 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20  **.** Syncing a 
265e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64  hot-journal to d
265f0 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  isk before attem
26600 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
26610 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a   back ensures .*
26620 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  * that if a powe
26630 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r-failure occurs
26640 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
26650 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73  back, the proces
26660 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70  s that.** attemp
26670 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  ts rollback foll
26680 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63  owing system rec
26690 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73  overy sees the s
266a0 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63  ame journal.** c
266b0 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70  ontent as this p
266c0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rocess..**.** If
266d0 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
266e0 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c   as planned, SQL
266f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26700 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
26710 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
26720 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
26730 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63  ic int pagerSync
26740 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
26750 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26760 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26770 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
26780 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
26790 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
267a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
267b0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
267c0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
267d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
267e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
267f0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
26800 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a  >jfd, &pPager->j
26810 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a  ournalHdr);.  }.
26820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26830 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72  /*.** Obtain a r
26840 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65  eference to a me
26850 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
26860 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65   object for page
26870 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a   number pgno. .*
26880 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
26890 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f   will use the po
268a0 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74  inter pData, obt
268b0 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63  ained from xFetc
268c0 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  h()..** If succe
268d0 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61  ssful, set *ppPa
268e0 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ge to point to t
268f0 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65  he new page refe
26900 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74  rence.** and ret
26910 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
26920 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
26930 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
26940 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a   code and set.**
26950 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f   *ppPage to zero
26960 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66  ..**.** Page ref
26970 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64  erences obtained
26980 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
26990 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
269a0 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   be released.** 
269b0 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72  by calling pager
269c0 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29  ReleaseMapPage()
269d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
269e0 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
269f0 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
26a00 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
26a10 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
26a20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  object */.  Pgno
26a30 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
26a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
26a50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
26a60 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20  void *pData,    
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61  /* xFetch()'d da
26a90 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ta for this page
26aa0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70   */.  PgHdr **pp
26ab0 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20  Page            
26ac0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63        /* OUT: Ac
26ad0 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65  quired page obje
26ae0 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ct */.){.  PgHdr
26af0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
26b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
26b10 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
26b20 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
26b30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
26b40 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a  MmapFreelist ){.
26b50 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
26b60 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
26b70 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61  reelist;.    pPa
26b80 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26b90 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  st = p->pDirty;.
26ba0 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
26bb0 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  0;.    memset(p-
26bc0 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67  >pExtra, 0, pPag
26bd0 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d  er->nExtra);.  }
26be0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
26bf0 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a  e = p = (PgHdr *
26c00 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
26c10 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29  ro(sizeof(PgHdr)
26c20 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
26c30 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  a);.    if( p==0
26c40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26c50 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
26c60 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
26c70 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
26c80 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
26c90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
26ca0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
26cb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45  .    }.    p->pE
26cc0 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26  xtra = (void *)&
26cd0 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  p[1];.    p->fla
26ce0 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b  gs = PGHDR_MMAP;
26cf0 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
26d00 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20  ;.    p->pPager 
26d10 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20  = pPager;.  }.. 
26d20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74   assert( p->pExt
26d30 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31  ra==(void *)&p[1
26d40 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
26d50 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ->pPage==0 );.  
26d60 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73  assert( p->flags
26d70 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a  ==PGHDR_MMAP );.
26d80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
26d90 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
26da0 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
26db0 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e  ==1 );..  p->pgn
26dc0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70  o = pgno;.  p->p
26dd0 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
26de0 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
26df0 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ++;..  return SQ
26e00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
26e10 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
26e20 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50  rence to page pP
26e30 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65  g. pPg must have
26e40 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62   been returned b
26e50 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72  y an .** earlier
26e60 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63   call to pagerAc
26e70 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a  quireMapPage()..
26e80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
26e90 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
26ea0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
26eb0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
26ec0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
26ed0 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
26ee0 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72  t--;.  pPg->pDir
26ef0 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d  ty = pPager->pMm
26f00 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50  apFreelist;.  pP
26f10 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26f20 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73  ist = pPg;..  as
26f30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64  sert( pPager->fd
26f40 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
26f50 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c  sion>=3 );.  sql
26f60 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
26f70 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
26f80 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61  pPg->pgno-1)*pPa
26f90 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
26fa0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f  Pg->pData);.}../
26fb0 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67  *.** Free all Pg
26fc0 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72  Hdr objects stor
26fd0 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ed in the Pager.
26fe0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69  pMmapFreelist li
26ff0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
27000 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  id pagerFreeMapH
27010 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  drs(Pager *pPage
27020 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  r){.  PgHdr *p;.
27030 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a    PgHdr *pNext;.
27040 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
27050 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70  pMmapFreelist; p
27060 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
27070 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74  pNext = p->pDirt
27080 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  y;.    sqlite3_f
27090 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ree(p);.  }.}...
270a0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
270b0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
270c0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
270d0 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
270e0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
270f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
27100 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
27110 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
27120 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
27130 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
27140 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
27150 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
27160 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
27170 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
27180 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
27190 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
271a0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
271b0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
271c0 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
271d0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
271e0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
271f0 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
27200 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
27210 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
27220 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
27230 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
27240 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
27250 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
27260 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
27270 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
27280 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
27290 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
272a0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
272b0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
272c0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
272d0 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
272e0 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
272f0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
27300 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
27310 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
27320 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
27330 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
27340 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65  mpSpace;..  asse
27350 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
27360 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
27370 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ;.  disable_simu
27380 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
27390 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
273a0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
273b0 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  .  pagerFreeMapH
273c0 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  drs(pPager);.  /
273d0 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  * pPager->errCod
273e0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
273f0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
27400 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
27410 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
27420 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65   sqlite3WalClose
27430 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
27440 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
27450 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61  lags, pPager->pa
27460 67 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20  geSize, pTmp);. 
27470 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20   pPager->pWal = 
27480 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65  0;.#endif.  page
27490 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
274a0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
274b0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
274c0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
274d0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20  e{.    /* If it 
274e0 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68  is open, sync th
274f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
27500 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e  efore calling Un
27510 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e  lockAndRollback.
27520 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
27530 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65  is not done, the
27540 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f  n an unsynced po
27550 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65  rtion of the ope
27560 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  n journal .    *
27570 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c  * file may be pl
27580 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
27590 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
275a0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
275b0 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77  occurs .    ** w
275c0 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70  hile this is hap
275d0 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
275e0 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d  base could becom
275f0 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
27600 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65  *.    ** If an e
27610 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
27620 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63  e trying to sync
27630 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68   the journal, sh
27640 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ift the pager.  
27650 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52    ** into the ER
27660 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20  ROR state. This 
27670 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64  causes UnlockAnd
27680 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f  Rollback to unlo
27690 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  ck the.    ** da
276a0 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65  tabase and close
276b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
276c0 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70  e without attemp
276d0 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a  ting to roll it.
276e0 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66      ** back or f
276f0 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20  inalize it. The 
27700 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73  next database us
27710 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  er will have to 
27720 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20  do hot-journal. 
27730 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62     ** rollback b
27740 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20  efore accessing 
27750 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27760 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
27770 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27780 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70  >jfd) ){.      p
27790 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
277a0 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  r, pagerSyncHotJ
277b0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b  ournal(pPager));
277c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
277d0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
277e0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
277f0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
27800 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
27810 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
27820 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
27830 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
27840 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
27850 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
27860 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
27870 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
27880 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
27890 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c  ger->jfd);.  sql
278a0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
278b0 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
278c0 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
278d0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
278e0 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
278f0 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
27900 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
27910 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
27920 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
27930 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
27940 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
27950 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
27960 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
27970 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
27980 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
27990 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
279a0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
279b0 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
279c0 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
279d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
279e0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
279f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
27a00 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
27a10 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
27a20 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
27a30 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
27a40 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
27a50 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
27a60 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
27a70 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
27a80 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
27a90 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
27aa0 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
27ab0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
27ac0 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
27ad0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
27ae0 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
27af0 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
27b00 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
27b10 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
27b20 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
27b30 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
27b40 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
27b50 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
27b60 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
27b70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
27b80 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
27b90 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
27ba0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
27bb0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
27bc0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
27bd0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
27be0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
27bf0 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  f the Pager.noSy
27c00 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nc flag is set, 
27c10 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
27c20 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
27c30 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
27c40 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
27c50 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
27c60 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64  journal-mode and
27c70 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20   the .** device 
27c80 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
27c90 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  of the file-syst
27ca0 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
27cb0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
27cc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27cd0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
27ce0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
27cf0 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
27d00 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
27d10 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
27d20 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
27d30 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
27d40 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
27d50 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
27d60 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
27d70 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
27d80 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
27d90 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
27da0 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
27db0 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
27dc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
27dd0 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
27de0 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
27df0 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
27e00 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
27e10 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
27e20 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
27e30 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
27e40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27e50 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
27e60 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
27e70 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
27e80 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
27e90 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
27ea0 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
27eb0 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
27ec0 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
27ed0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
27ee0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
27ef0 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
27f00 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
27f10 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
27f20 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
27f30 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
27f40 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
27f50 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
27f60 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
27f70 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
27f80 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
27f90 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
27fa0 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
27fb0 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
27fc0 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
27fd0 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66  .**   }.**.** If
27fe0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
27ff0 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
28000 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
28010 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
28020 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
28030 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
28040 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
28050 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
28060 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
28070 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
28080 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
28090 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
280a0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
280b0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
280c0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
280d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
280e0 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74  t newHdr){.  int
280f0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28110 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
28120 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28130 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
28140 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
28150 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
28160 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
28170 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
28180 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
28190 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
281a0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
281b0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
281c0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
281d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
281e0 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
281f0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
28200 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28210 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
28220 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
28230 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
28240 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
28250 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
28260 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
28270 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
28280 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
28290 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
282a0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  ){.      const i
282b0 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
282c0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
282d0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
282e0 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
282f0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
28300 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
28310 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
28320 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
28330 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
28340 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
28350 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62  deals with an ob
28360 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49  scure problem. I
28370 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65  f the last conne
28380 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ction.        **
28390 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74   that wrote to t
283a0 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73  his database was
283b0 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65   operating in pe
283c0 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  rsistent-journal
283d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
283e0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
283f0 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74  al file may at t
28400 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c  his point actual
28410 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20  ly be larger.   
28420 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67       ** than Pag
28430 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79  er.journalOff by
28440 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74  tes. If the next
28450 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f   thing in the jo
28460 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
28470 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f   file happens to
28480 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   be a journal-he
28490 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73  ader (written as
284a0 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20   part of the.   
284b0 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
284c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72   connection's tr
284d0 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
284e0 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
284f0 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
28500 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
28510 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
28520 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
28530 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
28540 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
28550 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
28560 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28570 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
28580 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
28590 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
285a0 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
285b0 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
285c0 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
285d0 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
285e0 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
285f0 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
28600 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
28610 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
28620 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
28630 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
28640 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
28650 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
28660 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
28670 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
28680 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
28690 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
286a0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
286b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
286c0 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
286d0 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
286e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
286f0 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
28700 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
28710 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
28720 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
28730 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
28740 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
28750 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
28760 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
28770 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
28780 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
28790 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
287a0 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
287b0 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
287c0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
287d0 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
287e0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
287f0 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
28800 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
28810 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
28820 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
28830 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
28840 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
28850 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
28860 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
28870 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
28880 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
28890 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
288a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
288b0 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
288c0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20  set;.        u8 
288d0 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20  aMagic[8];.     
288e0 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69     u8 zHeader[si
288f0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
28900 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20  ic)+4];..       
28910 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
28920 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
28930 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
28940 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
28950 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
28960 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
28970 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
28980 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
28990 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65     iNextHdrOffse
289a0 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  t = journalHdrOf
289b0 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
289c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
289d0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
289e0 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
289f0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
28a00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
28a20 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
28a30 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
28a40 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
28a50 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
28a60 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
28a70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28a80 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
28a90 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
28aa0 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
28ab0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
28ac0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
28ad0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
28ae0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
28af0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
28b00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
28b10 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
28b20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
28b30 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
28b40 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
28b50 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
28b60 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
28b70 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
28b80 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
28b90 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
28ba0 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
28bb0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
28bc0 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
28bd0 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
28be0 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
28bf0 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
28c00 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
28c10 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
28c20 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
28c30 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
28c40 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
28c50 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
28c60 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
28c70 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
28c80 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
28c90 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
28ca0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
28cb0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
28cc0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
28cd0 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
28ce0 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
28cf0 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
28d00 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
28d10 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
28d20 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
28d30 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
28d40 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
28d50 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
28d60 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
28d70 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
28d80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
28d90 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
28da0 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
28db0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
28dc0 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
28dd0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28de0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
28df0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28e00 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
28e10 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
28e20 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
28e30 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
28e40 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
28e50 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
28e60 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
28e70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28e80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28e90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28ea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
28eb0 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
28ec0 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
28ed0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
28ee0 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  dr));.        rc
28ef0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
28f00 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e(.            p
28f10 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
28f20 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
28f30 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  der), pPager->jo
28f40 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20  urnalHdr.       
28f50 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
28f60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28f70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28f80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d   }.      if( 0==
28f90 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
28fa0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
28fb0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
28fc0 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
28fd0 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
28fe0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
28ff0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
29000 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
29010 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
29020 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
29030 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
29040 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
29050 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
29060 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
29070 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
29080 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
29090 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
290a0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
290b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
290c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
290d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67     }..      pPag
290e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
290f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
29100 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Off;.      if( n
29110 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63  ewHdr && 0==(iDc
29120 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
29130 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
29140 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
29150 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ec = 0;.        
29160 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
29170 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
29180 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29190 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
291a0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
291b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
291c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
291d0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
291e0 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
291f0 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68  ..  /* Unless th
29200 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
29210 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  Sync mode, the j
29220 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
29230 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65  just .  ** succe
29240 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
29250 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61  Either way, clea
29260 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
29270 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20  _SYNC flag on . 
29280 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20   ** all pages.. 
29290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
292a0 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67  cheClearSyncFlag
292b0 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
292c0 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53  e);.  pPager->eS
292d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
292e0 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73  TER_DBMOD;.  ass
292f0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
29300 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
29310 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
29320 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
29330 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
29340 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
29350 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
29360 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
29370 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
29380 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
29390 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
293a0 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
293b0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
293c0 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
293d0 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
293e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
293f0 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
29400 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
29410 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
29420 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
29430 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
29440 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
29450 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
29460 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
29470 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
29480 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
29490 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
294a0 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
294b0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
294c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
294d0 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
294e0 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
294f0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
29500 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
29510 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
29520 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
29530 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
29540 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
29550 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
29560 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
29570 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
29580 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
29590 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
295a0 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
295b0 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
295c0 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
295d0 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
295e0 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
295f0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
29600 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
29610 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
29620 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
29630 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
29640 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
29650 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
29660 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
29670 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29680 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
29690 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
296a0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
296b0 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
296c0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
296d0 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
296e0 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
296f0 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
29700 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
29710 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
29720 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
29730 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
29740 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
29750 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
29760 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
29770 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
29780 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
29790 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
297a0 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
297b0 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
297c0 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
297d0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
297e0 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
297f0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
29800 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
29810 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
29820 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
29830 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
29840 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
29850 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
29860 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
29870 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
29880 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
29890 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
298a0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
298b0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
298c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
298d0 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
298e0 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
298f0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
29900 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
29910 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
29920 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
29930 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  Hdr *pList){.  i
29940 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
29950 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
29960 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
29970 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
29980 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
29990 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c  y called for rol
299a0 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20  lback pagers in 
299b0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
299c0 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
299d0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
299e0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
299f0 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
29a00 69 6c 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ile || pPager->e
29a10 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
29a20 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61  TER_DBMOD );.  a
29a30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
29a40 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
29a50 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
29a60 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
29a70 6c 65 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  le==0 || pList->
29a80 70 44 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20  pDirty==0 );..  
29a90 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
29aa0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61  s a temp-file ha
29ab0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
29ac0 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
29ad0 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e  ow. It.  ** is n
29ae0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
29af0 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74  rc to be other t
29b00 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
29b10 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
29b20 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70  * is taken, as p
29b30 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
29b40 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
29b50 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20  or temp-files.. 
29b60 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
29b70 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
29b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
29b90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
29ba0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29bb0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
29bc0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
29bd0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
29be0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
29bf0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
29c00 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65   the first write
29c10 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61  , give the VFS a
29c20 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68   hint of what th
29c30 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  e final.  ** fil
29c40 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a  e size will be..
29c50 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72    */.  assert( r
29c60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
29c70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
29c80 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  d) );.  if( rc==
29c90 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26  SQLITE_OK .   &&
29ca0 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
29cb0 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
29cc0 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d  ze.   && (pList-
29cd0 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74  >pDirty || pList
29ce0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
29cf0 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a  bHintSize).  ){.
29d00 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
29d10 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65  4 szFile = pPage
29d20 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73  r->pageSize * (s
29d30 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61  qlite3_int64)pPa
29d40 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
29d50 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
29d60 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
29d70 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
29d80 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73  TL_SIZE_HINT, &s
29d90 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67  zFile);.    pPag
29da0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
29db0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
29dc0 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
29dd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29de0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
29df0 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
29e00 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
29e10 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
29e20 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
29e30 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
29e40 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
29e50 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
29e60 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
29e70 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
29e80 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
29e90 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
29ea0 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
29eb0 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
29ec0 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
29ed0 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
29ee0 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
29ef0 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
29f00 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
29f10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
29f20 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
29f30 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
29f40 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
29f50 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
29f60 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
29f70 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
29f80 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20  rDontWrite()).. 
29f90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
29fa0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
29fb0 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
29fc0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
29fd0 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
29fe0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
29ff0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
2a000 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
2a010 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
2a020 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
2a030 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2a060 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
2a070 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72     ..      asser
2a080 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  t( (pList->flags
2a090 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2a0a0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
2a0b0 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
2a0c0 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
2a0d0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
2a0e0 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  st);..      /* E
2a0f0 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61  ncode the databa
2a100 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45  se */.      CODE
2a110 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  C2(pPager, pList
2a120 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36  ->pData, pgno, 6
2a130 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2a140 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74  NOMEM_BKPT, pDat
2a150 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
2a160 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
2a170 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
2a180 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2a190 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
2a1a0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
2a1b0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
2a1c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
2a1d0 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
2a1e0 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
2a1f0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
2a200 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
2a210 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
2a220 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
2a230 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
2a240 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
2a250 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
2a260 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
2a270 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
2a280 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
2a290 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
2a2a0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
2a2b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2a2c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2a2d0 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
2a2e0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
2a2f0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
2a300 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2a310 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
2a320 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
2a330 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
2a340 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
2a350 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
2a360 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
2a370 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20  TAT_WRITE]++;.. 
2a380 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
2a390 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
2a3a0 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
2a3b0 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
2a3c0 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
2a3d0 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
2a3e0 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
2a3f0 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70  up, pgno, (u8*)p
2a400 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20  List->pData);.. 
2a410 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2a420 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
2a430 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
2a440 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a450 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
2a460 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
2a470 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
2a480 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  )));.      IOTRA
2a490 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
2a4a0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
2a4b0 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
2a4c0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
2a4d0 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
2a4e0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
2a4f0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2a500 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
2a510 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2a520 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
2a530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
2a540 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
2a550 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74  List);.    pList
2a560 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
2a570 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2a580 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73  rc;.}../*.** Ens
2a590 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62  ure that the sub
2a5a0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2a5b0 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20   open. If it is 
2a5c0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
2a5d0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
2a5e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
2a5f0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2a600 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
2a610 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
2a620 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e  ding to plan. An
2a630 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
2a640 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
2a650 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2a660 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
2a670 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61  3OsOpen() .** fa
2a680 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2a690 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
2a6a0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
2a6b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2a6c0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69  ITE_OK;.  if( !i
2a6d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2a6e0 66 64 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  fd) ){.    const
2a6f0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 53 51   int flags =  SQ
2a700 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
2a710 52 4e 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RNAL | SQLITE_OP
2a720 45 4e 5f 52 45 41 44 57 52 49 54 45 20 0a 20 20  EN_READWRITE .  
2a730 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
2a740 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
2a750 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
2a760 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45   .      | SQLITE
2a770 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
2a780 4f 53 45 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74  OSE;.    int nSt
2a790 6d 74 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65  mtSpill = sqlite
2a7a0 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69  3Config.nStmtSpi
2a7b0 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ll;.    if( pPag
2a7c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
2a7d0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2a7e0 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61  DE_MEMORY || pPa
2a7f0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
2a800 79 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74  y ){.      nStmt
2a810 53 70 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  Spill = -1;.    
2a820 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
2a830 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  e3JournalOpen(pP
2a840 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
2a850 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61  Pager->sjfd, fla
2a860 67 73 2c 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b  gs, nStmtSpill);
2a870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
2a890 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
2a8a0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
2a8b0 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
2a8c0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
2a8d0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2a8e0 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69  sful, set the bi
2a8f0 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
2a900 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  to pPg->pgno in 
2a910 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66  the bitvecs.** f
2a920 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  or all open save
2a930 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65  points before re
2a940 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  turning..**.** T
2a950 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2a960 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urns SQLITE_OK i
2a970 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
2a980 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49  successful, an I
2a990 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  O.** error code 
2a9a0 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
2a9b0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73  o write to the s
2a9c0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  ub-journal fails
2a9d0 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  , or .** SQLITE_
2a9e0 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
2a9f0 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65  c fails while se
2aa00 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61  tting a bit in a
2aa10 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69   savepoint.** bi
2aa20 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tvec..*/.static 
2aa30 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  int subjournalPa
2aa40 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
2aa50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2aa60 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
2aa70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2aa80 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ger;.  if( pPage
2aa90 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
2aaa0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2aab0 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a  E_OFF ){..    /*
2aac0 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   Open the sub-jo
2aad0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73  urnal, if it has
2aae0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
2aaf0 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20  n opened */.    
2ab00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ab10 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
2ab20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2ab30 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
2ab40 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2ab50 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ger) );.    asse
2ab60 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2ab70 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67  r->sjfd) || pPag
2ab80 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29  er->nSubRec==0 )
2ab90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
2aba0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2abb0 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
2abc0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61  ageInJournal(pPa
2abd0 67 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20  ger, pPg) .     
2abe0 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
2abf0 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
2ac00 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
2ac10 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
2ac20 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
2ac30 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
2ac40 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
2ac50 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
2ac60 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
2ac70 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
2ac80 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
2ac90 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
2aca0 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
2acb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2acc0 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
2acd0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
2ace0 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
2acf0 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65  set = (i64)pPage
2ad00 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
2ad10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
2ad20 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
2ad30 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
2ad40 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
2ad50 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
2ad60 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2ad70 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74  NOMEM_BKPT, pDat
2ad80 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  a2);.      PAGER
2ad90 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
2ada0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
2adb0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2adc0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
2add0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
2ade0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
2adf0 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
2ae00 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
2ae10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ae20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2ae30 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2ae40 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
2ae50 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
2ae60 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
2ae70 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +4);.      }.   
2ae80 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
2ae90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2aea0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
2aeb0 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
2aec0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2aed0 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
2aee0 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
2aef0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
2af00 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
2af10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
2af20 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
2af30 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72  rnalPageIfRequir
2af40 65 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ed(PgHdr *pPg){.
2af50 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
2af60 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
2af70 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75     return subjou
2af80 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
2af90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2afa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2afb0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2afc0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2afd0 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
2afe0 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
2aff0 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
2b000 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
2b010 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
2b020 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
2b030 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
2b040 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
2b050 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
2b060 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
2b070 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
2b080 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
2b090 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
2b0a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2b0b0 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
2b0c0 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
2b0d0 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
2b0e0 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
2b0f0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2b100 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
2b110 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
2b120 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2b130 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
2b140 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
2b150 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
2b160 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
2b170 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2b180 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
2b190 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
2b1a0 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
2b1b0 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
2b1c0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
2b1d0 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
2b1e0 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
2b1f0 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
2b200 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
2b210 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
2b220 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2b230 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
2b240 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
2b250 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2b260 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2b270 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2b280 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
2b290 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
2b2a0 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
2b2b0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2b2c0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
2b2d0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
2b2e0 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
2b2f0 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
2b300 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
2b310 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2b320 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2b330 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
2b340 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2b350 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
2b360 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2b370 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
2b380 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2b390 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
2b3a0 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
2b3b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b3c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
2b3d0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
2b3e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
2b3f0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2b400 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
2b410 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59   doNotSpill NOSY
2b420 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64 75  NC bit is set du
2b430 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20  ring times when 
2b440 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a  doing a sync of.
2b450 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e    ** journal (an
2b460 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68  d adding a new h
2b470 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c  eader) is not al
2b480 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63  lowed.  This occ
2b490 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
2b4a0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2b4b0 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69  PagerWrite() whi
2b4c0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75  le trying to jou
2b4d0 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20  rnal multiple.  
2b4e0 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69  ** pages belongi
2b4f0 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ng to the same s
2b500 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ector..  **.  **
2b510 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
2b520 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46  ROLLBACK and OFF
2b530 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20 61   bits inhibits a
2b540 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e  ll cache spillin
2b550 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73  g.  ** regardles
2b560 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
2b570 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65  not a sync is re
2b580 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73  quired.  This is
2b590 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a   set during.  **
2b5a0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62   a rollback or b
2b5b0 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c 20  y user request, 
2b5c0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20  respectively..  
2b5d0 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67  **.  ** Spilling
2b5e0 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69   is also prohibi
2b5f0 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65  ted when in an e
2b600 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65  rror state since
2b610 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a   that could.  **
2b620 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
2b630 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20  e corruption.   
2b640 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
2b650 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74  mplementation it
2b660 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73   .  ** is imposs
2b670 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ible for sqlite3
2b680 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f  PcacheFetch() to
2b690 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
2b6a0 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20  createFlag==3.  
2b6b0 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  ** while in the 
2b6c0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e  error state, hen
2b6d0 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  ce it is impossi
2b6e0 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
2b6f0 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20  tine to.  ** be 
2b700 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72  called in the er
2b710 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65  ror state.  Neve
2b720 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63  rtheless, we inc
2b730 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20  lude a NEVER(). 
2b740 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65   ** test for the
2b750 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20   error state as 
2b760 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69  a safeguard agai
2b770 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67  nst future chang
2b780 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  es..  */.  if( N
2b790 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
2b7a0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53  Code) ) return S
2b7b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74  QLITE_OK;.  test
2b7c0 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2b7d0 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2b7e0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  FLAG_ROLLBACK );
2b7f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2b800 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2b810 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20  & SPILLFLAG_OFF 
2b820 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2b830 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2b840 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  l & SPILLFLAG_NO
2b850 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50  SYNC );.  if( pP
2b860 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2b870 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d  .   && ((pPager-
2b880 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53  >doNotSpill & (S
2b890 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2b8a0 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29  K|SPILLFLAG_OFF)
2b8b0 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70  )!=0.      || (p
2b8c0 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
2b8d0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29  R_NEED_SYNC)!=0)
2b8e0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2b8f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2b900 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
2b910 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55   0;.  if( pagerU
2b920 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
2b930 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  .    /* Write a 
2b940 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72  single frame for
2b950 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68   this page to th
2b960 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  e log. */.    rc
2b970 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
2b980 65 49 66 52 65 71 75 69 72 65 64 28 70 50 67 29  eIfRequired(pPg)
2b990 3b 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ; .    if( rc==S
2b9a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b9b0 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46    rc = pagerWalF
2b9c0 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50  rames(pPager, pP
2b9d0 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  g, 0, 0);.    }.
2b9e0 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
2b9f0 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
2ba00 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
2ba10 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
2ba20 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2ba30 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20  R_NEED_SYNC .   
2ba40 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
2ba50 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
2ba60 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29  R_CACHEMOD.    )
2ba70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
2ba80 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
2ba90 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   1);.    }.  .  
2baa0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
2bab0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2bac0 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64  age out to the d
2bad0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2bae0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2baf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bb00 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
2bb10 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2bb20 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
2bb30 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2bb40 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
2bb50 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  r, pPg);.    }. 
2bb60 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
2bb70 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
2bb80 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2bb90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
2bba0 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
2bbb0 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
2bbc0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2bbd0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2bbe0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2bbf0 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
2bc00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2bc10 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2bc20 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  r, rc); .}../*.*
2bc30 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65  * Flush all unre
2bc40 66 65 72 65 6e 63 65 64 20 64 69 72 74 79 20 70  ferenced dirty p
2bc50 61 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  ages to disk..*/
2bc60 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2bc70 72 46 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50  rFlush(Pager *pP
2bc80 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2bc90 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
2bca0 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  e;.  if( !MEMDB 
2bcb0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c  ){.    PgHdr *pL
2bcc0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
2bcd0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2bce0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2bcf0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
2bd00 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
2bd10 61 67 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69  ager) );.    whi
2bd20 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2bd30 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
2bd40 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
2bd50 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
2bd60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
2bd70 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  t->nRef==0 ){.  
2bd80 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2bd90 53 74 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50  Stress((void*)pP
2bda0 61 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ager, pList);.  
2bdb0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73      }.      pLis
2bdc0 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d  t = pNext;.    }
2bdd0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2bde0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
2bdf0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2be00 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20  ize a new Pager 
2be10 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61  object and put a
2be20 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a   pointer to it.*
2be30 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54  * in *ppPager. T
2be40 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
2be50 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72  eventually be fr
2be60 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69  eed by passing i
2be70 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  t.** to sqlite3P
2be80 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a  agerClose()..**.
2be90 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
2bea0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2beb0 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74   path to the dat
2bec0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2bed0 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  en..** If zFilen
2bee0 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
2bef0 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
2bf00 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
2bf10 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
2bf20 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
2bf30 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
2bf40 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  . Temporary file
2bf50 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64  s are be deleted
2bf60 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
2bf70 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  y when they are 
2bf80 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65  closed. If zFile
2bf90 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
2bfa0 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20  :" then .** all 
2bfb0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
2bfc0 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74  eld in cache. It
2bfd0 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2bfe0 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54  n to disk. .** T
2bff0 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
2c000 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  to implement an 
2c010 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2c020 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  se..**.** The nE
2c030 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73  xtra parameter s
2c040 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d  pecifies the num
2c050 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2c060 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a  space allocated.
2c070 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61  ** along with ea
2c080 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ch page referenc
2c090 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73  e. This space is
2c0a0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2c0b0 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68  e user.** via th
2c0c0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
2c0d0 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a  tExtra() API..**
2c0e0 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72  .** The flags ar
2c0f0 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  gument is used t
2c100 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72  o specify proper
2c110 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74  ties that affect
2c120 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f   the.** operatio
2c130 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20  n of the pager. 
2c140 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  It should be pas
2c150 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65  sed some bitwise
2c160 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20   combination.** 
2c170 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66  of the PAGER_* f
2c180 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
2c190 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
2c1a0 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
2c1b0 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
2c1c0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
2c1d0 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
2c1e0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
2c1f0 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
2c200 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
2c210 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
2c220 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
2c230 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
2c240 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
2c250 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
2c260 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
2c270 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
2c280 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
2c290 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
2c2a0 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
2c2b0 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
2c2c0 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
2c2d0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
2c2e0 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
2c2f0 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
2c300 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2c310 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2c320 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
2c330 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
2c340 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
2c350 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
2c360 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
2c370 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
2c380 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
2c390 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
2c3a0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2c3b0 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
2c3c0 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
2c3d0 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
2c3e0 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
2c3f0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
2c400 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
2c410 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
2c420 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
2c430 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2c440 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2c450 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2c460 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
2c470 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
2c480 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
2c490 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
2c4a0 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2c4b0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
2c4c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c4d0 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
2c4e0 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
2c4f0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
2c500 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2c510 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
2c520 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
2c530 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
2c540 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
2c550 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
2c560 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
2c570 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
2c580 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
2c590 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2c5a0 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
2c5b0 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
2c5c0 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
2c5d0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2c5e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
2c5f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2c600 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
2c610 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2c620 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
2c630 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
2c640 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
2c650 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
2c660 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2c670 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
2c680 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
2c690 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
2c6a0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2c6b0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
2c6c0 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
2c6d0 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
2c6e0 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
2c6f0 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2c700 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
2c710 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
2c720 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
2c730 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
2c740 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
2c750 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
2c760 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
2c770 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2c780 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
2c790 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
2c7a0 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
2c7b0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
2c7c0 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
2c7d0 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
2c7e0 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53  */.  int pcacheS
2c7f0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ize = sqlite3Pca
2c800 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20  cheSize();      
2c810 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2c820 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65  ocate for PCache
2c830 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65   */.  u32 szPage
2c840 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  Dflt = SQLITE_DE
2c850 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2c860 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67    /* Default pag
2c870 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73  e size */.  cons
2c880 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30  t char *zUri = 0
2c890 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73  ;    /* URI args
2c8a0 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
2c8b0 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20  t nUri = 0;     
2c8c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c8d0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52 49   of bytes of URI
2c8e0 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a   args at *zUri *
2c8f0 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
2c900 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
2c910 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
2c920 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2c930 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20  ile-handle.  ** 
2c940 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f  (there are two o
2c950 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e  f them, the main
2c960 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
2c970 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20   sub-journal).  
2c980 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  */.  journalFile
2c990 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2c9a0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
2c9b0 28 70 56 66 73 29 29 3b 0a 0a 20 20 2f 2a 20 53  (pVfs));..  /* S
2c9c0 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
2c9d0 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69  riable to NULL i
2c9e0 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
2c9f0 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70  occurs. */.  *pp
2ca00 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e  Pager = 0;..#ifn
2ca10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ca20 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66  MEMORYDB.  if( f
2ca30 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d  lags & PAGER_MEM
2ca40 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62  ORY ){.    memDb
2ca50 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46   = 1;.    if( zF
2ca60 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2ca70 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20  name[0] ){.     
2ca80 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2ca90 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
2caa0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2cab0 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
2cac0 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c  =0  ) return SQL
2cad0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2cae0 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20        nPathname 
2caf0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2cb00 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
2cb10 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
2cb20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
2cb30 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  dif..  /* Comput
2cb40 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
2cb50 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e  full pathname in
2cb60 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75   an allocated bu
2cb70 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a  ffer pointed.  *
2cb80 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d  * to by zPathnam
2cb90 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e  e, length nPathn
2cba0 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73  ame. Or, if this
2cbb0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2cbc0 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65  file,.  ** leave
2cbd0 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20   both nPathname 
2cbe0 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65  and zPathname se
2cbf0 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  t to 0..  */.  i
2cc00 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
2cc10 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
2cc20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2cc30 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  z;.    nPathname
2cc40 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
2cc50 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68  ame+1;.    zPath
2cc60 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  name = sqlite3Db
2cc70 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61  MallocRaw(0, nPa
2cc80 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69  thname*2);.    i
2cc90 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
2cca0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2ccb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2ccc0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61  T;.    }.    zPa
2ccd0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
2cce0 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
2ccf0 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
2cd00 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
2cd10 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ails */.    rc =
2cd20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
2cd30 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
2cd40 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
2cd50 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
2cd60 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2cd70 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2cd80 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Pathname);.    z
2cd90 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65   = zUri = &zFile
2cda0 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  name[sqlite3Strl
2cdb0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
2cdc0 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  1];.    while( *
2cdd0 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  z ){.      z += 
2cde0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2cdf0 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  z)+1;.      z +=
2ce00 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2ce10 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  (z)+1;.    }.   
2ce20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a   nUri = (int)(&z
2ce30 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20  [1] - zUri);.   
2ce40 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30   assert( nUri>=0
2ce50 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
2ce60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
2ce70 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
2ce80 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
2ce90 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2cea0 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
2ceb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
2cec0 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2ced0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2cee0 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
2cef0 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
2cf00 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
2cf10 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
2cf20 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
2cf30 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
2cf40 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
2cf50 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
2cf60 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
2cf70 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
2cf80 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2cf90 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
2cfa0 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
2cfb0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
2cfc0 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
2cfd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2cfe0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2cff0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2d000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d010 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
2d020 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2d030 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
2d040 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2d050 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
2d060 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
2d070 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2d080 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
2d090 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
2d0a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2d0b0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2d0c0 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
2d0d0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
2d0e0 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
2d0f0 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
2d100 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
2d110 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
2d120 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
2d130 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
2d140 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
2d150 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
2d160 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
2d170 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
2d180 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2d190 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2d1a0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
2d1b0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
2d1c0 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
2d1d0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2d1e0 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
2d1f0 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2d200 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2d210 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2d220 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
2d230 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2d240 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2d250 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2d260 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2d270 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2d280 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
2d290 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2d2a0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
2d2b0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2d2c0 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
2d2d0 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
2d2e0 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
2d2f0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
2d300 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2d310 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
2d320 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
2d330 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
2d340 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
2d350 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
2d360 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
2d370 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2d380 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
2d390 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
2d3a0 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
2d3b0 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
2d3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d3d0 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
2d3e0 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
2d3f0 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20  name + 1 + nUri 
2d400 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69  +         /* zFi
2d410 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
2d420 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20  athname + 8 + 2 
2d430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d440 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e  zJournal */.#ifn
2d450 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d460 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e  WAL.    + nPathn
2d470 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20  ame + 4 + 2     
2d480 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a         /* zWal *
2d490 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  /.#endif.  );.  
2d4a0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2d4b0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c  TE_ALIGNMENT(SQL
2d4c0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a  ITE_INT_TO_PTR(j
2d4d0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29  ournalFileSize))
2d4e0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
2d4f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2d500 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2d510 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
2d520 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2d530 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
2d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
2d550 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
2d560 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
2d570 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
2d580 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
2d590 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
2d5a0 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
2d5b0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2d5c0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2d5d0 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
2d5e0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
2d5f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2d600 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2d610 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
2d620 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
2d630 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2d640 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2d650 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
2d660 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
2d670 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
2d680 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2d690 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
2d6a0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2d6b0 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
2d6c0 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
2d6d0 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
2d6e0 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
2d6f0 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
2d700 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
2d710 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
2d720 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
2d730 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29  t( nPathname>0 )
2d740 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  ;.    pPager->zJ
2d750 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72  ournal =   (char
2d760 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68  *)(pPtr += nPath
2d770 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29  name + 1 + nUri)
2d780 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2d790 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2d7a0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2d7b0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  name);.    if( n
2d7c0 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50  Uri ) memcpy(&pP
2d7d0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2d7e0 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55  nPathname+1], zU
2d7f0 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  ri, nUri);.    m
2d800 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
2d810 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ournal, zPathnam
2d820 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2d830 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2d840 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2d850 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61  hname], "-journa
2d860 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20  l\000", 8+2);.  
2d870 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2d880 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2d890 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2d8a0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64  zJournal);.#ifnd
2d8b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2d8c0 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  AL.    pPager->z
2d8d0 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  Wal = &pPager->z
2d8e0 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2d8f0 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  e+8+1];.    memc
2d900 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  py(pPager->zWal,
2d910 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2d920 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2d930 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c  py(&pPager->zWal
2d940 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77  [nPathname], "-w
2d950 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20  al\000", 4+1);. 
2d960 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2d970 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2d980 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2d990 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20  >zWal);.#endif. 
2d9a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2d9b0 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2d9c0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
2d9d0 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
2d9e0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
2d9f0 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
2da00 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
2da10 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2da20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2da30 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2da40 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
2da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da60 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
2da70 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
2da80 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
2da90 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2daa0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
2dab0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
2dac0 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
2dad0 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
2dae0 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65  !memDb );.    re
2daf0 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
2db00 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2db10 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
2db20 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
2db30 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
2db40 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
2db50 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
2db60 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
2db70 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
2db80 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
2db90 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
2dba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2dbb0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2dbc0 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
2dbd0 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
2dbe0 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
2dbf0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2dc00 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
2dc10 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
2dc20 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
2dc30 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
2dc40 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
2dc50 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
2dc60 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
2dc70 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
2dc80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2dc90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2dca0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2dcb0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2dcc0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2dcd0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2dce0 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29   if( !readOnly )
2dcf0 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63  {.        setSec
2dd00 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2dd10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2dd20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2dd30 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2dd40 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2dd50 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
2dd60 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2dd70 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2dd80 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
2dd90 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
2dda0 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
2ddb0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2ddc0 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
2ddd0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2dde0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2ddf0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
2de00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2de10 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2de20 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2de30 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2de40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2de50 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2de60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2de70 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
2de80 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
2de90 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
2dea0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2deb0 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
2dec0 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
2ded0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2dee0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
2def0 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
2df00 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2df10 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2df20 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2df30 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
2df40 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
2df50 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
2df60 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2df70 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
2df80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2df90 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
2dfa0 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
2dfb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dfc0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2dfd0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  i;.            }
2dfe0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2dff0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2e000 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
2e010 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c  er->noLock = sql
2e020 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2e030 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c  (zFilename, "nol
2e040 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ock", 0);.      
2e050 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54  if( (iDc & SQLIT
2e060 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c  E_IOCAP_IMMUTABL
2e070 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  E)!=0.       || 
2e080 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
2e090 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ean(zFilename, "
2e0a0 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29  immutable", 0) )
2e0b0 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46  {.          vfsF
2e0c0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2e0d0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2e0e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74          goto act
2e0f0 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b  _like_temp_file;
2e100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2e120 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
2e130 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
2e140 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
2e150 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
2e160 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2e170 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
2e180 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2e190 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
2e1a0 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
2e1b0 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
2e1c0 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
2e1d0 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
2e1e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2e1f0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
2e200 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
2e210 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2e220 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
2e230 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2e240 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
2e250 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
2e260 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2e270 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
2e280 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
2e290 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
2e2a0 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
2e2b0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2e2c0 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66  anch also runs f
2e2d0 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20  or files marked 
2e2e0 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20  as immutable..  
2e2f0 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74    */ .act_like_t
2e300 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65  emp_file:.    te
2e310 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
2e320 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2e330 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20   PAGER_READER;  
2e340 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2e350 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
2e360 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67  lock */.    pPag
2e370 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c  er->eLock = EXCL
2e380 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f  USIVE_LOCK;    /
2e390 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65  * Pretend we are
2e3a0 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f   in EXCLUSIVE mo
2e3b0 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  de */.    pPager
2e3c0 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20  ->noLock = 1;   
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e3e0 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f  Do no locking */
2e3f0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2e400 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
2e410 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2e420 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
2e430 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
2e440 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
2e450 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
2e460 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
2e470 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
2e480 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
2e490 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
2e4a0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
2e4b0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2e4c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e4d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2e4e0 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
2e4f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2e500 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
2e510 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
2e520 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
2e530 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
2e540 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
2e550 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50  Initialize the P
2e560 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f  Cache object. */
2e570 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2e580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2e590 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20  rt( nExtra<1000 
2e5a0 29 3b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20  );.    nExtra = 
2e5b0 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a  ROUND8(nExtra);.
2e5c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e5d0 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
2e5e0 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
2e5f0 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
2e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
2e610 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
2e620 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
2e630 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
2e640 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  che);.  }..  /* 
2e650 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2e660 72 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65 65  rred above, free
2e670 20 74 68 65 20 20 50 61 67 65 72 20 73 74 72 75   the  Pager stru
2e680 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
2e690 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
2e6a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e6b0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2e6c0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2e6d0 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
2e6e0 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
2e6f0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
2e700 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2e710 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
2e720 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41  rn rc;.  }..  PA
2e730 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20  GERTRACE(("OPEN 
2e740 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
2e750 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66  NDLEID(pPager->f
2e760 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  d), pPager->zFil
2e770 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41  ename));.  IOTRA
2e780 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
2e790 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
2e7a0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
2e7b0 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
2e7c0 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a  urnal = (u8)useJ
2e7d0 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61  ournal;.  /* pPa
2e7e0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
2e7f0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e800 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
2e810 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e820 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
2e830 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2e840 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2e850 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
2e860 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2e870 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
2e880 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2e890 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
2e8a0 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
2e8b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e8c0 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
2e8d0 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  CK; */.  /* pPag
2e8e0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
2e8f0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
2e900 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d  mpFile = (u8)tem
2e910 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
2e920 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2e930 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
2e940 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
2e950 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
2e960 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2e970 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
2e980 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2e990 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2e9a0 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
2e9b0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
2e9c0 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a   (u8)tempFile; .
2e9d0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2e9e0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
2e9f0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2ea00 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
2ea10 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61  (u8)memDb;.  pPa
2ea20 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
2ea30 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  (u8)readOnly;.  
2ea40 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e  assert( useJourn
2ea50 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  al || pPager->te
2ea60 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67  mpFile );.  pPag
2ea70 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
2ea80 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2ea90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
2eaa0 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
2eab0 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
2eac0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ync==0 );.    as
2ead0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78  sert( pPager->ex
2eae0 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  traSync==0 );.  
2eaf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2eb00 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ->syncFlags==0 )
2eb10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2eb20 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
2eb30 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2eb40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70  ert( pPager->ckp
2eb50 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  tSyncFlags==0 );
2eb60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
2eb70 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
2eb80 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2eb90 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20  extraSync = 0;. 
2eba0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
2ebb0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2ebc0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
2ebd0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2ebe0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2ebf0 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53  C_NORMAL | WAL_S
2ec00 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
2ec10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
2ec20 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
2ec30 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2ec40 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
2ec50 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
2ec60 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2ec70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
2ec80 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2ec90 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
2eca0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
2ecb0 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20  = (u16)nExtra;. 
2ecc0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2ecd0 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49  SizeLimit = SQLI
2ece0 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e  TE_DEFAULT_JOURN
2ecf0 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20  AL_SIZE_LIMIT;. 
2ed00 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2ed10 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74  pPager->fd) || t
2ed20 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74  empFile );.  set
2ed30 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2ed40 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f  r);.  if( !useJo
2ed50 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61  urnal ){.    pPa
2ed60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2ed70 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2ed80 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  MODE_OFF;.  }els
2ed90 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20  e if( memDb ){. 
2eda0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2edb0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2edc0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2edd0 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
2ede0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
2edf0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2ee00 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
2ee10 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
2ee20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
2ee30 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f  r = xReinit;.  /
2ee40 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
2ee50 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
2ee60 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
2ee70 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  ); */.  /* pPage
2ee80 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49  r->szMmap = SQLI
2ee90 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f  TE_DEFAULT_MMAP_
2eea0 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20  SIZE // will be 
2eeb0 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a  set by btree.c *
2eec0 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  /..  *ppPager = 
2eed0 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
2eee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
2eef0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
2ef00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ef10 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65   has not be dele
2ef20 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f  ted or renamed o
2ef30 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72  ut from.** under
2ef40 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74   the pager.  Ret
2ef50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
2ef60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2ef70 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f   still were it o
2ef80 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e  ught.** to be on
2ef90 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e   disk.  Return n
2efa0 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f  on-zero (SQLITE_
2efb0 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
2efc0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
2efd0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f  rror.** code fro
2efe0 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  m sqlite3OsAcces
2eff0 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61  s()) if the data
2f000 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69  base has gone mi
2f010 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssing..*/.static
2f020 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55   int databaseIsU
2f030 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50  nmoved(Pager *pP
2f040 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61  ager){.  int bHa
2f050 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e  sMoved = 0;.  in
2f060 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
2f070 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20  ger->tempFile ) 
2f080 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f090 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2f0a0 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75  dbSize==0 ) retu
2f0b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2f0c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2f0d0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61  zFilename && pPa
2f0e0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30  ger->zFilename[0
2f0f0 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ] );.  rc = sqli
2f100 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
2f110 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
2f120 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
2f130 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29  VED, &bHasMoved)
2f140 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2f150 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
2f160 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53     /* If the HAS
2f170 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74  _MOVED file-cont
2f180 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65  rol is unimpleme
2f190 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61  nted, assume tha
2f1a0 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  t the file.    *
2f1b0 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  * has not been m
2f1c0 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20 74  oved.  That is t
2f1d0 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65  he historical be
2f1e0 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65  havior of SQLite
2f1f0 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a  : prior to.    *
2f200 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c  * version 3.8.3,
2f210 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65   it never checke
2f220 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  d */.    rc = SQ
2f230 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2f240 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f250 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20  OK && bHasMoved 
2f260 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2f270 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
2f280 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VED;.  }.  retur
2f290 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2f2a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2f2b0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72   called after tr
2f2c0 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
2f2d0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f   PAGER_UNLOCK to
2f2e0 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44  .** PAGER_SHARED
2f2f0 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73   state. It tests
2f300 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
2f310 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65  ot journal prese
2f320 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c  nt in.** the fil
2f330 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
2f340 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20   given pager. A 
2f350 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
2f360 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64  ne that .** need
2f370 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
2f380 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74  ack. According t
2f390 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2f3a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
2f3b0 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66  * file exists if
2f3c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2f3d0 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a  riteria are met:
2f3e0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a  .**.**   * The j
2f3f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2f400 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73  ts in the file s
2f410 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20  ystem, and.**   
2f420 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c  * No process hol
2f430 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ds a RESERVED or
2f440 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
2f450 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f460 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  le, and.**   * T
2f470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f480 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74   itself is great
2f490 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20  er than 0 bytes 
2f4a0 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20  in size, and.** 
2f4b0 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79    * The first by
2f4c0 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  te of the journa
2f4d0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
2f4e0 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a  d is not 0x00..*
2f4f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
2f500 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
2f510 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2f520 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
2f530 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
2f540 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
2f550 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
2f560 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
2f570 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
2f580 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
2f590 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e name. In this 
2f5a0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
2f5b0 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74   file is.** just
2f5c0 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f   deleted using O
2f5d0 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74  sDelete, *pExist
2f5e0 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  s is set to 0 an
2f5f0 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  d SQLITE_OK.** i
2f600 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
2f610 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
2f620 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66  oes not check if
2f630 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74   there is a mast
2f640 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
2f650 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ame.** at the en
2f660 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49  d of the file. I
2f670 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20  f there is, and 
2f680 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  that master jour
2f690 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73  nal file.** does
2f6a0 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
2f6b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f6c0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2f6d0 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20  hot. In this.** 
2f6e0 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
2f6f0 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  e will return a 
2f700 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20  false-positive. 
2f710 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
2f720 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
2f730 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68  will discover th
2f740 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
2f750 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
2f760 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69  y hot and .** wi
2f770 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62  ll not roll it b
2f780 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ack. .**.** If a
2f790 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2f7a0 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78  e is found to ex
2f7b0 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ist, *pExists is
2f7c0 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a   set to 1 and .*
2f7d0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
2f7e0 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d  rned. If no hot-
2f7f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f800 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74  present, *pExist
2f810 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  s is.** set to 0
2f820 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
2f830 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2f840 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2f850 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
2f860 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
2f870 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74  her or not a hot
2f880 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78  -journal file ex
2f890 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72  ists, the IO err
2f8a0 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65  or.** code is re
2f8b0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
2f8c0 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73  alue of *pExists
2f8d0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
2f8e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2f8f0 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
2f900 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
2f910 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74  Exists){.  sqlit
2f920 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
2f930 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
2f940 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fs;.  int rc = S
2f950 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2f960 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2f970 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73  de */.  int exis
2f980 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ts = 1;         
2f990 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f9a0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
2f9b0 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
2f9c0 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21  int jrnlOpen = !
2f9d0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2f9e0 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  jfd);..  assert(
2f9f0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2fa00 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
2fa10 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2fa20 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
2fa30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2fa40 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a  =PAGER_OPEN );..
2fa50 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70    assert( jrnlOp
2fa60 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74  en==0 || ( sqlit
2fa70 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2fa80 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2fa90 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c  ->jfd) &.    SQL
2faa0 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
2fab0 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a  TABLE_WHEN_OPEN.
2fac0 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74    ));..  *pExist
2fad0 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72  s = 0;.  if( !jr
2fae0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  nlOpen ){.    rc
2faf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
2fb00 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  ss(pVfs, pPager-
2fb10 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
2fb20 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
2fb30 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20   &exists);.  }. 
2fb40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fb50 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a  OK && exists ){.
2fb60 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d      int locked =
2fb70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2fb80 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20  /* True if some 
2fb90 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
2fba0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
2fbb0 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f  ..    /* Race co
2fbc0 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41  ndition here:  A
2fbd0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
2fbe0 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68  ight have been h
2fbf0 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  olding the.    *
2fc00 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  * the RESERVED l
2fc10 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a  ock and have a j
2fc20 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74  ournal open at t
2fc30 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  he sqlite3OsAcce
2fc40 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c  ss() .    ** cal
2fc50 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65  l above, but the
2fc60 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
2fc70 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68  rnal and drop th
2fc80 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20  e lock before.  
2fc90 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74    ** we get to t
2fca0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
2fcb0 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
2fcc0 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20  vedLock() call. 
2fcd0 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   If that.    ** 
2fce0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69  is the case, thi
2fcf0 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2fd00 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61  think there is a
2fd10 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65   hot journal whe
2fd20 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74  n.    ** in fact
2fd30 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20   there is none. 
2fd40 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
2fd50 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
2fd60 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20  e which will.   
2fd70 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
2fd80 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63  h by the playbac
2fd90 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b  k routine.  Tick
2fda0 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f  et #3883..    */
2fdb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2fdc0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2fdd0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
2fde0 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69   &locked);.    i
2fdf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fe00 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20   && !locked ){. 
2fe10 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
2fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2fe40 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
2fe50 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 72  file */..      r
2fe60 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
2fe70 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
2fe80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2fe90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fea0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
2feb0 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65 72   database is zer
2fec0 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c  o pages in size,
2fed0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
2fee0 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65 0a   either (1) the.
2fef0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
2ff00 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20  al is a remnant 
2ff10 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74  from a prior dat
2ff20 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
2ff30 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20  ame name where. 
2ff40 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61         ** the da
2ff50 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74 20  tabase file but 
2ff60 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
2ff70 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20  was deleted, or 
2ff80 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  (2) the initial.
2ff90 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
2ffa0 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75  action that popu
2ffb0 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74 61  lates a new data
2ffc0 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f  base is being ro
2ffd0 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20  lled back..     
2ffe0 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20     ** In either 
2fff0 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  case, the journa
30000 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65  l file can be de
30010 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c  leted.  However,
30020 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20   take care.     
30030 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c     ** not to del
30040 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
30050 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c  file if it is al
30060 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74  ready open due t
30070 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  o.        ** jou
30080 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
30090 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  T..        */.  
300a0 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
300b0 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20  =0 && !jrnlOpen 
300c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
300d0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
300e0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
300f0 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b     if( pagerLock
30100 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
30110 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54  VED_LOCK)==SQLIT
30120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30130 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
30140 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
30150 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
30160 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30170 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
30180 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e  veMode ) pagerUn
30190 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
301a0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
301b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
301c0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
301d0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
301e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
301f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
30200 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
30210 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f   and no other co
30220 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72  nnection has a r
30230 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20  eserved.        
30240 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20    ** or greater 
30250 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
30260 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63  base file. Now c
30270 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20  heck that there 
30280 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
30290 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e  at least one non
302a0 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74  -zero bytes at t
302b0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
302c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
302d0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
302e0 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20  ere is, then we 
302f0 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f  consider this jo
30300 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e  urnal to be hot.
30310 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20   If not, .      
30320 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
30330 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20   ignored..      
30340 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
30350 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
30360 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
30370 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
30380 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
30390 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
303a0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
303b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
303c0 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
303d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
303e0 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b  er->jfd, f, &f);
303f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30400 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
30410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30420 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74          u8 first
30430 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
30440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30450 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
30460 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74  , (void *)&first
30470 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
30480 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30490 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
304a0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
304b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
304c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
304d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
304e0 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
304f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
30500 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
30510 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
30520 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30530 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
30540 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
30550 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
30560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
30570 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
30580 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
30590 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
305a0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
305b0 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
305c0 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
305d0 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65    ** it has a ze
305e0 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
305f0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
30600 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
30610 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30620 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
30630 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
30640 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
30650 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
30660 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
30670 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
30680 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
30690 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
306a0 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
306b0 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
306c0 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
306d0 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
306e0 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
306f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
30700 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
30710 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
30720 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
30730 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
30740 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
30750 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
30760 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
30770 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
30780 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
30790 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
307a0 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
307b0 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
307c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
307d0 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
307e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
307f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
30800 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
30810 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
30820 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30830 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
30840 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
30850 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
30860 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
30870 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
30880 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
30890 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
308a0 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61 66  erGet() until af
308b0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
308c0 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
308d0 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
308e0 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
308f0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
30900 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
30910 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30920 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
30930 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
30940 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
30950 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
30960 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
30970 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
30980 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
30990 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
309a0 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
309b0 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
309c0 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
309d0 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
309e0 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
309f0 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
30a00 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
30a10 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30a20 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
30a30 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
30a40 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
30a50 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
30a60 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
30a70 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
30a80 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
30a90 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
30aa0 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
30ab0 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
30ac0 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
30ad0 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
30ae0 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
30af0 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
30b00 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
30b10 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
30b20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
30b30 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
30b40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30b50 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
30b60 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
30b70 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
30b80 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
30b90 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
30ba0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
30bb0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
30bc0 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
30bd0 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
30be0 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
30bf0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
30c00 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
30c10 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
30c20 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
30c30 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
30c40 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
30c50 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
30c60 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
30c70 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
30c80 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
30c90 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
30ca0 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
30cb0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
30cc0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
30cd0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
30ce0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
30cf0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
30d00 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
30d10 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
30d20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
30d30 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
30d40 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
30d50 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c   file or .** rol
30d60 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
30d70 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
30d80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
30d90 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
30da0 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
30db0 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
30dc0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
30dd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
30de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
30df0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
30e00 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
30e10 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
30e20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
30e30 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
30e40 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
30e50 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54  tanding pages. T
30e60 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
30e70 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65   the pager state
30e80 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20   should either. 
30e90 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52   ** be OPEN or R
30ea0 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73  EADER. READER is
30eb0 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
30ec0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
30ed0 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65  r was in .  ** e
30ee0 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
30ef0 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mode..  */.  ass
30f00 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
30f10 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
30f20 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
30f30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
30f40 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
30f50 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
30f60 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
30f70 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
30f80 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
30f90 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
30fa0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45  ;.  if( NEVER(ME
30fb0 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
30fc0 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72  rrCode) ){ retur
30fd0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
30fe0 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67  e; }..  if( !pag
30ff0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
31000 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
31010 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
31020 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f  {.    int bHotJo
31030 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20  urnal = 1;      
31040 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
31050 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f  here exists a ho
31060 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a  t journal-file *
31070 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
31080 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63  MEMDB );..    rc
31090 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
310a0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
310b0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
310c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
310d0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
310e0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
310f0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ==NO_LOCK || pPa
31100 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
31110 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
31120 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
31130 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
31140 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
31150 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
31160 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
31170 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
31180 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
31190 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
311a0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
311b0 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
311c0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
311d0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
311e0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
311f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
31200 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
31210 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
31220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31240 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
31250 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
31260 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
31270 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
31280 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
31290 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
312a0 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
312b0 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f  BACK;.        go
312c0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
312d0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74   }..      /* Get
312e0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
312f0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
31300 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
31310 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
31320 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20     ** important 
31330 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20  that a RESERVED 
31340 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61  lock is not obta
31350 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20  ined on the way 
31360 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
31370 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
31380 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
31390 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
313a0 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
313b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
313c0 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
313d0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
313e0 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
313f0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
31400 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
31410 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
31420 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
31430 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20   rolling the .  
31440 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
31450 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  al back..      *
31460 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61  * .      ** Beca
31470 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
31480 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
31490 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
314a0 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a  ted, any.      *
314b0 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  * other process 
314c0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63  attempting to ac
314d0 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
314e0 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20  e file will get 
314f0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  to .      ** thi
31500 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
31510 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20  ode and fail to 
31520 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45  obtain its own E
31530 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20  XCLUSIVE lock . 
31540 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
31550 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
31560 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
31570 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
31580 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d   is in locking_m
31590 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
315a0 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a  de, the lock is.
315b0 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61        ** downgra
315c0 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f  ded to SHARED_LO
315d0 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  CK before this f
315e0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
315f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31600 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
31610 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
31620 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
31630 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31640 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
31650 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
31660 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  }. .      /* If 
31670 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
31680 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66  y open and the f
31690 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ile exists on di
316a0 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20  sk, open the .  
316b0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
316c0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
316d0 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65  cess. Write acce
316e0 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ss is required b
316f0 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a  ecause .      **
31700 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
31710 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
31720 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
31730 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
31740 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f  .      ** and po
31750 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
31760 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
31770 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72  ter on. Also, wr
31780 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20  ite-access .    
31790 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20    ** is usually 
317a0 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61  required to fina
317b0 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
317c0 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   in journal_mode
317d0 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20  =persist .      
317e0 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73  ** mode (and als
317f0 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  o for journal_mo
31800 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73  de=truncate on s
31810 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20  ome systems)..  
31820 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
31830 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64  If the journal d
31840 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69  oes not exist, i
31850 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20  t usually means 
31860 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20  that some .     
31870 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
31880 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20  tion managed to 
31890 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20  get in and roll 
318a0 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a  it back before .
318b0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
318c0 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
318d0 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
318e0 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
318f0 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  it .      ** may
31900 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70   mean that the p
31910 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20  ager was in the 
31920 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
31930 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
31940 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
31950 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  ed and the journ
31960 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
31970 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
31980 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70  .      if( !isOp
31990 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
319a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
319b0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
319c0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
319d0 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  fs;.        int 
319e0 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20  bExists;        
319f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
31a00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
31a10 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ists */.        
31a20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
31a30 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
31a40 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
31a50 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
31a60 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
31a70 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20  &bExists);.     
31a80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31a90 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20  E_OK && bExists 
31aa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
31ab0 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
31ac0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
31ad0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
31ae0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
31af0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
31b00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
31b10 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
31b20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
31b30 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
31b40 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
31b50 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
31b60 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
31b70 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31b80 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
31b90 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
31ba0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
31bb0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31bc0 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
31bd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
31be0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
31bf0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31c00 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
31c10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31c20 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
31c30 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
31c40 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
31c50 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
31c60 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
31c70 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
31c80 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
31c90 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
31ca0 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
31cb0 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
31cc0 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63  ock. Purge the c
31cd0 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20  ache before.    
31ce0 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63    ** playing bac
31cf0 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  k the hot-journa
31d00 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e  l so that we don
31d10 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20  't end up with. 
31d20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e       ** an incon
31d30 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20  sistent cache.  
31d40 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75  Sync the hot jou
31d50 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
31d60 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  ing.      ** it 
31d70 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70  back since the p
31d80 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73  rocess that cras
31d90 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65  hed and left the
31da0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot journal.   
31db0 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64     ** probably d
31dc0 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61  id not sync it a
31dd0 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72  nd we are requir
31de0 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e  ed to always syn
31df0 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a  c.      ** the j
31e00 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
31e10 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20  aying it back.. 
31e20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
31e30 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
31e40 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
31e50 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
31e60 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
31e70 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63    rc = pagerSync
31e80 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
31e90 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
31ea0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31eb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31ec0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
31ed0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
31ee0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
31ef0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
31f00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31f10 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
31f20 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
31f30 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  de ){.        pa
31f40 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
31f50 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
31f60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31f70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31f80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
31f90 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
31fa0 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f  taken if an erro
31fb0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
31fc0 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20  rying to open.  
31fd0 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c        ** or roll
31fe0 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
31ff0 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  nal while holdin
32000 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
32010 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20  ock. The.       
32020 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   ** pager_unlock
32030 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
32040 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
32050 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e   returning to un
32060 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  lock.        ** 
32070 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
32080 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20   unlock attempt 
32090 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65  fails, then Page
320a0 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a  r.eLock must be.
320b0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
320c0 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28  o UNKNOWN_LOCK (
320d0 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
320e0 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
320f0 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  e for .        *
32100 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61  * UNKNOWN_LOCK a
32110 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c  bove for an expl
32120 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20  anation). .     
32130 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
32140 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   In order to get
32150 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
32160 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20  to do this, set 
32170 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a  Pager.eState to.
32180 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52          ** PAGER
32190 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73  _ERROR now. This
321a0 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
321b0 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72   counted as a tr
321c0 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20  ansition.       
321d0 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61   ** to ERROR sta
321e0 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  te in the state 
321f0 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74  diagram at the t
32200 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c  op of this file,
32210 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63  .        ** sinc
32220 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  e we know that t
32230 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20  he same call to 
32240 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
32250 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20  ill very.       
32260 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e   ** shortly tran
32270 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72  sition the pager
32280 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f   object to the O
32290 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69  PEN state. Calli
322a0 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ng.        ** as
322b0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
322c0 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f  () would fail no
322d0 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20  w, as it should 
322e0 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
322f0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
32300 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
32310 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a  when there are z
32320 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ero outstanding 
32330 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  page .        **
32340 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20   references..   
32350 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32360 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
32370 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
32380 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
32390 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
323a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
323b0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
323c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
323d0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
323e0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
323f0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61           || (pPa
32400 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
32410 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  de && pPager->eL
32420 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
32430 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
32440 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
32450 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50  ->tempFile && pP
32460 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
32470 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  redLock ){.     
32480 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
32490 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
324a0 6e 20 61 63 71 75 69 72 65 64 20 74 68 65 6e 20  n acquired then 
324b0 63 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a  check to.      *
324c0 2a 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  * see if the dat
324d0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
324e0 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
324f0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
32500 61 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  anged,.      ** 
32510 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e  flush the cache.
32520 20 20 54 68 65 20 68 61 73 48 65 6c 64 53 68 61    The hasHeldSha
32530 72 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65  redLock flag pre
32540 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a  vents this from.
32550 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69        ** occurri
32560 6e 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66  ng on the very f
32570 69 72 73 74 20 61 63 63 65 73 73 20 74 6f 20 61  irst access to a
32580 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20   file, in order 
32590 74 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20 20  to save a.      
325a0 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65  ** single unnece
325b0 73 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52  ssary sqlite3OsR
325c0 65 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68  ead() call at th
325d0 65 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20  e start-up..    
325e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61    **.      ** Da
325f0 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 61  tabase changes a
32600 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  re detected by l
32610 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
32620 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
32630 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
32640 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
32650 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
32660 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
32670 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20   are.      ** a 
32680 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
32690 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
326a0 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
326b0 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
326c0 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
326d0 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
326e0 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
326f0 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
32700 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
32710 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a   use..      ** .
32720 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
32730 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
32740 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
32750 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
32760 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a  not be .      **
32770 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
32780 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
32790 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
327a0 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
327b0 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
327c0 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
327d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e      */.      Pgn
327e0 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  o nPage = 0;.   
327f0 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
32800 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
32810 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
32820 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
32830 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
32840 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
32850 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
32860 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69  failed;..      i
32870 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
32880 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
32890 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
328a0 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
328b0 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
328c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
328d0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
328e0 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
328f0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
32900 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
32910 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32920 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
32930 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
32940 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
32950 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
32960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32970 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
32980 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
32990 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
329a0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
329b0 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ..      if( memc
329c0 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
329d0 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
329e0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
329f0 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
32a00 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
32a10 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20  (pPager);..     
32a20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20     /* Unmap the 
32a30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
32a40 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
32a50 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63  at external proc
32a60 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  esses.        **
32a70 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61   may have trunca
32a80 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ted the database
32a90 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65   file and then e
32aa0 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a  xtended it back.
32ab0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74          ** to it
32ac0 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20  s original size 
32ad0 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
32ae0 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69  ss was not holdi
32af0 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  ng a lock..     
32b00 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
32b10 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69  se there may exi
32b20 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20  st a Pager.pMap 
32b30 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70  mapping that app
32b40 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ears.        ** 
32b50 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20  to be the right 
32b60 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20  size but is not 
32b70 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20  actually valid. 
32b80 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20  Avoid this.     
32b90 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74     ** possibilit
32ba0 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74  y by unmapping t
32bb0 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20  he db here. */. 
32bc0 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45         if( USEFE
32bd0 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20  TCH(pPager) ){. 
32be0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32bf0 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
32c00 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->fd, 0, 0);.   
32c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32c20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
32c30 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66  there is a WAL f
32c40 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
32c50 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69  system, open thi
32c60 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41  s database in WA
32c70 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f  L.    ** mode. O
32c80 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f  therwise, the fo
32c90 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
32ca0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
32cb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
32cc0 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  = pagerOpenWalIf
32cd0 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b  Present(pPager);
32ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32cf0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73  OMIT_WAL.    ass
32d00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
32d10 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  l==0 || rc==SQLI
32d20 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a  TE_OK );.#endif.
32d30 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
32d40 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
32d50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
32d60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
32d70 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67     rc = pagerBeg
32d80 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
32d90 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  n(pPager);.  }..
32da0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
32db0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32dc0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
32dd0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
32de0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
32df0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62  ger, &pPager->db
32e00 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69  Size);.  }.. fai
32e10 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
32e20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32e30 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
32e40 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  ;.    pager_unlo
32e50 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
32e60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32e70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
32e80 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EN );.  }else{. 
32e90 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
32ea0 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
32eb0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 68 61  ;.    pPager->ha
32ec0 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
32ed0 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
32ee0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
32ef0 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
32f00 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
32f10 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b  d zero, rollback
32f20 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74   any active.** t
32f30 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
32f40 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
32f50 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
32f60 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
32f70 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68  XCLUSIVE when th
32f80 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
32f90 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  o in.** the roll
32fa0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
32fb0 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  e unlock is not 
32fc0 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68  performed and th
32fd0 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e  ere is.** nothin
32fe0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73  g to rollback, s
32ff0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
33000 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73  s a no-op..*/ .s
33010 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
33020 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
33030 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
33040 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d   if( pPager->nMm
33050 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c  apOut==0 && (sql
33060 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
33070 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
33080 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
33090 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
330a0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
330b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75   }.}../*.** Acqu
330c0 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
330d0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
330e0 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
330f0 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
33100 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
33110 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
33120 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
33130 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
33140 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
33150 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
33160 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
33170 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
33180 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
33190 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
331a0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
331b0 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
331c0 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
331d0 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
331e0 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
331f0 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
33200 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
33210 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
33220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
33230 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
33240 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
33250 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
33260 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
33270 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
33280 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
33290 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
332a0 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
332b0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
332c0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
332d0 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
332e0 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
332f0 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
33300 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
33310 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
33320 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
33330 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
33340 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
33350 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
33360 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
33370 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
33380 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
33390 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
333a0 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
333b0 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
333c0 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
333d0 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
333e0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
333f0 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
33400 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
33410 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61  ted page or if a
33420 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   .** non-zero va
33430 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73  lue is passed as
33440 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70   the noContent p
33450 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65  arameter and the
33460 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
33470 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
33480 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
33490 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
334a0 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
334b0 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
334c0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
334d0 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
334e0 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
334f0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
33500 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
33510 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
33520 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
33530 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
33540 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
33550 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
33560 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
33570 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
33580 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
33590 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
335a0 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
335b0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
335c0 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
335d0 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
335e0 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
335f0 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
33600 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
33610 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
33620 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
33630 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
33640 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
33650 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
33660 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
33670 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  l..**.** If noCo
33680 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74  ntent is true, t
33690 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74  hen the data ret
336a0 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20  urned is zeroed 
336b0 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65  instead of.** be
336c0 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ing read from th
336d0 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
336e0 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69  tionally, the bi
336f0 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ts corresponding
33700 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50  .** to pgno in P
33710 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
33720 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73  (bitvec of pages
33730 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e   already written
33740 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   to the.** journ
33750 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
33760 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
33770 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
33780 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e  vecs of any open
33790 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61  .** savepoints a
337a0 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61  re set. This mea
337b0 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ns if the page i
337c0 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20  s made writable 
337d0 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20  at any.** point 
337e0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75  in the future, u
337f0 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73  sing a call to s
33800 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33810 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  (), its contents
33820 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  .** will not be 
33830 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20  journaled. This 
33840 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20  saves IO..**.** 
33850 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
33860 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
33870 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
33880 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
33890 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
338a0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
338b0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
338c0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
338d0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
338e0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  so sqlite3PagerL
338f0 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
33900 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
33910 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  Lookup() attempt
33920 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
33930 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
33940 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
33950 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
33960 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
33970 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
33980 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
33990 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
339a0 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75  in whereas Looku
339b0 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
339c0 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
339d0 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
339e0 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
339f0 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
33a00 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
33a10 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
33a20 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
33a30 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
33a40 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
33a50 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  Lookup() never g
33a60 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
33a70 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
33a80 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
33a90 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
33aa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33ab0 50 61 67 65 72 47 65 74 28 0a 20 20 50 61 67 65  PagerGet(.  Page
33ac0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
33ad0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
33ae0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
33af0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
33b00 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
33b10 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
33b20 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
33b30 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
33b40 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
33b50 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
33b60 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
33b70 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
33b80 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
33b90 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
33ba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33bb0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
33bc0 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20  0;.  u32 iFrame 
33bd0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33be0 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f       /* Frame to
33bf0 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66   read from WAL f
33c00 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ile */.  const i
33c10 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  nt noContent = (
33c20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
33c30 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20  T_NOCONTENT);.. 
33c40 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74   /* It is accept
33c50 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65  able to use a re
33c60 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70  ad-only (mmap) p
33c70 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65  age for any page
33c80 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67   except.  ** pag
33c90 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  e 1 if there is 
33ca0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
33cb0 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65  tion open or the
33cc0 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c   ACQUIRE_READONL
33cd0 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20  Y.  ** flag was 
33ce0 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
33cf0 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20   caller. And so 
33d00 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69  long as the db i
33d10 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65  s not a .  ** te
33d20 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
33d30 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
33d40 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62  */.  const int b
33d50 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31  MmapOk = (pgno>1
33d60 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50 61   && USEFETCH(pPa
33d70 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61 67  ger).   && (pPag
33d80 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33d90 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61  R_READER || (fla
33da0 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52  gs & PAGER_GET_R
33db0 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66  EADONLY)).#ifdef
33dc0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
33dd0 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e  C.   && pPager->
33de0 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66  xCodec==0.#endif
33df0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 74 69  .  );..  /* Opti
33e00 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  mization note:  
33e10 41 64 64 69 6e 67 20 74 68 65 20 22 70 67 6e 6f  Adding the "pgno
33e20 3c 3d 31 22 20 74 65 72 6d 20 62 65 66 6f 72 65  <=1" term before
33e30 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65 0a   "pgno==0" here.
33e40 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20    ** allows the 
33e50 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
33e60 65 72 20 74 6f 20 72 65 75 73 65 20 74 68 65 20  er to reuse the 
33e70 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 22  results of the "
33e80 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65 73  pgno>1".  ** tes
33e90 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
33ea0 73 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64  s statement, and
33eb0 20 61 76 6f 69 64 20 74 65 73 74 69 6e 67 20 70   avoid testing p
33ec0 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20 20  gno==0 in the.  
33ed0 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  ** common case w
33ee0 68 65 72 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  here pgno is lar
33ef0 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ge. */.  if( pgn
33f00 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30 20  o<=1 && pgno==0 
33f10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
33f20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33f30 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
33f40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
33f50 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
33f60 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
33f70 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
33f80 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
33f90 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20  t( noContent==0 
33fa0 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b  || bMmapOk==0 );
33fb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
33fc0 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
33fd0 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 2f  dLock==1 );..  /
33fe0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
33ff0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
34000 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tate, return an 
34010 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
34020 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  y. .  ** Otherwi
34030 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20  se, request the 
34040 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43  page from the PC
34050 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20  ache layer. */. 
34060 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
34070 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
34080 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
34090 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
340a0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62 4d  else{.    if( bM
340b0 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73  mapOk && pagerUs
340c0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
340d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
340e0 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
340f0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
34100 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
34110 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34120 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
34130 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34140 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4d     }..    if( bM
34150 6d 61 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d  mapOk && iFrame=
34160 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  =0 ){.      void
34170 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20   *pData = 0;..  
34180 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34190 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  OsFetch(pPager->
341a0 66 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  fd, .          (
341b0 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70  i64)(pgno-1) * p
341c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
341d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
341e0 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20 20 20  e, &pData.      
341f0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63  );..      if( rc
34200 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
34210 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
34220 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
34230 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20  te>PAGER_READER 
34240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
34250 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
34260 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
34270 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  no);.        }. 
34280 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d         if( pPg==
34290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
342a0 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65  c = pagerAcquire
342b0 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c 20  MapPage(pPager, 
342c0 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50  pgno, pData, &pP
342d0 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  g);.        }els
342e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
342f0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
34300 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
34310 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
34320 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
34330 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34340 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
34350 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
34360 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34370 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50  ;.          *ppP
34380 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  age = pPg;.     
34390 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
343a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
343b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
343c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
343d0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
343e0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
343f0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
34400 7d 0a 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73  }..    {.      s
34410 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61  qlite3_pcache_pa
34420 67 65 20 2a 70 42 61 73 65 3b 0a 20 20 20 20 20  ge *pBase;.     
34430 20 70 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33   pBase = sqlite3
34440 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
34450 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34460 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 3);.      if(
34470 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20   pBase==0 ){.   
34480 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34490 33 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65  3PcacheFetchStre
344a0 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ss(pPager->pPCac
344b0 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65  he, pgno, &pBase
344c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
344d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
344e0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
344f0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20 69  e_err;.        i
34500 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20  f( pBase==0 ){. 
34510 20 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 2a           pPg = *
34520 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
34530 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34540 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
34550 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
34560 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34580 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20 2a 70  }.      pPg = *p
34590 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  pPage = sqlite3P
345a0 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68  cacheFetchFinish
345b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
345c0 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a  , pgno, pBase);.
345d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
345e0 67 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  g!=0 );.    }.  
345f0 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
34600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
34610 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c   Either the call
34620 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
34630 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65  eFetch() returne
34640 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68  d an error or th
34650 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77  e.    ** pager w
34660 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  as already in th
34670 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
34680 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
34690 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
346a0 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30   ** Set pPg to 0
346b0 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65   and jump to the
346c0 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c   exception handl
346d0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20  er.  */.    pPg 
346e0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61  = 0;.    goto pa
346f0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34700 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
34710 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b  Pg==(*ppPage) );
34720 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
34730 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  pgno==pgno );.  
34740 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
34750 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70  ger==pPager || p
34760 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b  Pg->pPager==0 );
34770 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61  ..  if( pPg->pPa
34780 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e  ger && !noConten
34790 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
347a0 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61  his case the pca
347b0 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  che already cont
347c0 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ains an initiali
347d0 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20  zed copy of.    
347e0 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74  ** the page. Ret
347f0 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74  urn without furt
34800 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20  her ado.  */.   
34810 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50   assert( pgno<=P
34820 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26  AGER_MAX_PGNO &&
34830 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f   pgno!=PAGER_MJ_
34840 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
34850 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
34860 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54  t[PAGER_STAT_HIT
34870 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]++;.    return 
34880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
34890 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
348a0 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
348b0 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
348c0 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
348d0 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
348e0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
348f0 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 2d 3e 70    */..    pPg->p
34900 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
34910 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
34920 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
34930 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
34940 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
34950 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  f a page.    ** 
34960 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
34970 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65  han this, or the
34980 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d   unused locking-
34990 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74  page, is request
349a0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
349b0 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
349c0 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
349d0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
349e0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
349f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
34a00 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
34a10 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34a20 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
34a30 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65  ( MEMDB || pPage
34a40 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c  r->dbSize<pgno |
34a50 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21  | noContent || !
34a60 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
34a70 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
34a80 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
34a90 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  gno ){.        r
34aa0 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
34ab0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
34ac0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
34ae0 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
34af0 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75          /* Failu
34b00 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69  re to set the bi
34b10 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72  ts in the InJour
34b20 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20  nal bit-vectors 
34b30 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20  is benign..     
34b40 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20     ** It merely 
34b50 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
34b60 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
34b70 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
34b80 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  l a .        ** 
34b90 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
34ba0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
34bb0 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
34bc0 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
34bd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  .        ** to t
34be0 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65  est the case whe
34bf0 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  re a malloc erro
34c00 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
34c10 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20  rying to set .  
34c20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69        ** a bit i
34c30 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a  n a bit vector..
34c40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
34c50 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
34c60 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
34c70 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c         if( pgno<
34c80 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
34c90 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
34ca0 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
34cb0 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
34cc0 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
34cd0 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
34ce0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
34cf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
34d00 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EM );.        }.
34d10 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
34d20 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61  ( rc = ) addToSa
34d30 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
34d40 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
34d50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34d60 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
34d70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
34d80 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
34d90 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oc();.      }.  
34da0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
34db0 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
34dc0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
34dd0 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
34de0 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
34df0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
34e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
34e10 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
34e20 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d  ger) && bMmapOk=
34e30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
34e40 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
34e50 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
34e60 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61  Wal, pgno, &iFra
34e70 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
34e80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34e90 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34ea0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
34eb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
34ec0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
34ed0 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  er );.      pPag
34ee0 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
34ef0 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20  STAT_MISS]++;.  
34f00 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
34f10 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29  age(pPg, iFrame)
34f20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
34f30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34f40 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
34f50 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34f60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
34f70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
34f80 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  h(pPg);.  }..  r
34f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34fa0 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
34fb0 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
34fc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
34fd0 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
34fe0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
34ff0 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
35000 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
35010 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a  ed(pPager);..  *
35020 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
35030 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35040 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
35050 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
35060 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
35070 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
35080 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
35090 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
350a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
350b0 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
350c0 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
350d0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
350e0 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
350f0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
35100 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
35110 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
35120 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
35130 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
35140 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
35150 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
35160 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
35170 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
35180 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
35190 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
351a0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
351b0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
351c0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
351d0 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
351e0 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
351f0 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
35200 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
35210 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
35220 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
35230 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
35240 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63  o){.  sqlite3_pc
35250 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65  ache_page *pPage
35260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
35270 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
35280 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
35290 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
352a0 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20  pPCache!=0 );.  
352b0 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  pPage = sqlite3P
352c0 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
352d0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
352e0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
352f0 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pPage==0 || pPag
35300 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
35310 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70  dLock );.  if( p
35320 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
35330 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   0;.  return sql
35340 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
35350 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
35360 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61  Cache, pgno, pPa
35370 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
35380 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66  lease a page ref
35390 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erence..**.** If
353a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
353b0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
353c0 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
353d0 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
353e0 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
353f0 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
35400 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
35410 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
35420 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
35430 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
35440 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
35450 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35460 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
35470 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
35480 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
35490 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
354a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
354b0 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30    assert( pPg!=0
354c0 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70   );.  pPager = p
354d0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
354e0 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  ( pPg->flags & P
354f0 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20  GHDR_MMAP ){.   
35500 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
35510 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
35520 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  se{.    sqlite3P
35530 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
35540 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
35550 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
35560 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ger);.}.void sql
35570 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
35580 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
35590 66 28 20 70 50 67 20 29 20 73 71 6c 69 74 65 33  f( pPg ) sqlite3
355a0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
355b0 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l(pPg);.}../*.**
355c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
355d0 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
355e0 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77  start of every w
355f0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
35600 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  ..** There must 
35610 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
35620 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
35630 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
35640 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
35650 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
35660 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
35670 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
35680 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
35690 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77  ger pPager and w
356a0 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68  rite a journal h
356b0 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  eader.** to the 
356c0 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20  start of it. If 
356d0 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
356e0 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65   savepoints, ope
356f0 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
35700 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68  l.** as well. Th
35710 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
35720 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
35730 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
35740 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e  s being .** open
35750 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f  ed to write a ro
35760 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61  llback log for a
35770 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
35780 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a   is not used .**
35790 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   when opening a 
357a0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
357b0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
357c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
357d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
357e0 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20  lready open (as 
357f0 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63  it may be in exc
35800 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a  lusive mode),.**
35810 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
35820 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20  ion just writes 
35830 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
35840 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
35850 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20   the.** already 
35860 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  open file. .**.*
35870 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
35880 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35890 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74  e is opened by t
358a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
358b0 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f  e.** Pager.pInJo
358c0 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72  urnal bitvec str
358d0 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
358e0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ted..**.** Retur
358f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
35900 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
35910 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69  cessful. Otherwi
35920 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  se, return .** S
35930 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74  QLITE_NOMEM if t
35940 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  he attempt to al
35950 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e  locate Pager.pIn
35960 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  Journal fails, o
35970 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f  r .** an IO erro
35980 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e  r code if openin
35990 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
359a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
359b0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
359c0 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
359d0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
359e0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
359f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
35a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a10 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
35a20 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
35a30 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
35a40 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
35a50 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
35a60 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
35a70 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
35a80 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35a90 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35aa0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
35ab0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
35ac0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
35ad0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
35ae0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
35af0 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61    .  /* If alrea
35b00 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
35b10 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
35b20 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
35b30 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68    But on.  ** th
35b40 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
35b50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
35b60 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65  ver called if we
35b70 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
35b80 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74    ** an error st
35b90 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ate. */.  if( NE
35ba0 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
35bb0 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
35bc0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
35bd0 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
35be0 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
35bf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
35c00 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
35c10 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
35c20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35c30 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
35c40 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
35c50 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  >dbSize);.    if
35c60 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
35c70 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rnal==0 ){.     
35c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
35c90 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
35ca0 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .  .    /* Open 
35cb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35cc0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
35cd0 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20  ready open. */. 
35ce0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
35cf0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
35d00 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
35d10 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
35d20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
35d30 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
35d40 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
35d50 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
35d60 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  jfd);.      }els
35d70 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  e{.        int f
35d80 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
35d90 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
35da0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
35db0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70  .        int nSp
35dc0 69 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  ill;..        if
35dd0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
35de0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
35df0 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
35e00 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
35e10 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
35e20 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  TEMP_JOURNAL);. 
35e30 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20           nSpill 
35e40 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  = sqlite3Config.
35e50 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20  nStmtSpill;.    
35e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35e70 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
35e80 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
35e90 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
35ea0 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42    nSpill = jrnlB
35eb0 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
35ec0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35ed0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
35ee0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
35ef0 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69 6c  he database stil
35f00 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  l has the same n
35f10 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77 68  ame as it did wh
35f20 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  en.        ** it
35f30 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20   was originally 
35f40 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20  opened. */.     
35f50 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73 65     rc = database
35f60 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72  IsUnmoved(pPager
35f70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
35f80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35f90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35fa0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
35fb0 6e 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  n (.            
35fc0 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
35fd0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
35fe0 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53  ->jfd, flags, nS
35ff0 70 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29  pill.          )
36000 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36010 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
36020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36030 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
36040 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a  ->jfd) );.    }.
36050 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69    .  .    /* Wri
36060 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
36070 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
36080 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
36090 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a  and open .    **
360a0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
360b0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
360c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
360d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
360e0 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68       /* TODO: Ch
360f0 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
36100 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
36110 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
36120 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
36130 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
36140 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
36150 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36160 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
36170 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
36180 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
36190 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
361a0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
361b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
361c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
361d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
361e0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
361f0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
36200 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
36210 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
36220 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
36230 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
36240 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
36250 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61  OCKED );.    pPa
36260 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
36270 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
36280 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  MOD;.  }..  retu
36290 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
362a0 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72  Begin a write-tr
362b0 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
362c0 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72   specified pager
362d0 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a   object. If a .*
362e0 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
362f0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
36300 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69  been opened, thi
36310 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
36320 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
36330 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d  the exFlag argum
36340 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ent is false, th
36350 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
36360 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a  ast a RESERVED.*
36370 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
36380 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
36390 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
363a0 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
363b0 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c  least.** an EXCL
363c0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73  USIVE lock. If s
363d0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c  uch a lock is al
363e0 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c  ready held, no l
363f0 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74  ocking .** funct
36400 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c  ions need be cal
36410 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  led..**.** If th
36420 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
36430 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
36440 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75  ero, then any su
36450 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64  b-journal opened
36460 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
36470 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
36480 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   be opened as an
36490 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e   in-memory file.
364a0 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20   This.** has no 
364b0 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75  effect if the su
364c0 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72  b-journal is alr
364d0 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20  eady opened (as 
364e0 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a  it may be when.*
364f0 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  * running in exc
36500 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20  lusive mode) or 
36510 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
36520 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  on does not requ
36530 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75  ire a.** sub-jou
36540 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62  rnal. If the sub
36550 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
36560 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  nt is zero, then
36570 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a   any required.**
36580 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
36590 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d  implemented in-m
365a0 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20  emory if pPager 
365b0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
365c0 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72  database, .** or
365d0 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
365e0 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73  ry file otherwis
365f0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
36600 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65  3PagerBegin(Page
36610 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
36620 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49  xFlag, int subjI
36630 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20  nMemory){.  int 
36640 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
36650 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
36660 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20  rrCode ) return 
36670 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
36680 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36690 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
366a0 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65  _READER && pPage
366b0 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
366c0 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65  ERROR );.  pPage
366d0 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
366e0 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f  = (u8)subjInMemo
366f0 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59  ry;..  if( ALWAY
36700 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  S(pPager->eState
36710 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20  ==PAGER_READER) 
36720 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
36730 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36740 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28  l==0 );..    if(
36750 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
36760 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ger) ){.      /*
36770 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
36780 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
36790 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  se locking_mode=
367a0 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61  exclusive, and a
367b0 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75  n.      ** exclu
367c0 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
367d0 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
367e0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
367f0 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20  btain it now..  
36800 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
36810 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
36820 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65  veMode && sqlite
36830 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
36840 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
36850 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  -1) ){.        r
36860 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
36870 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
36880 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
36890 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
368a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
368b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
368c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 28 76 6f     }.        (vo
368d0 69 64 29 73 71 6c 69 74 65 33 57 61 6c 45 78 63  id)sqlite3WalExc
368e0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
368f0 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20  r->pWal, 1);.   
36900 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
36910 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f  rab the write lo
36920 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69  ck on the log fi
36930 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
36940 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20  l, upgrade to.  
36950 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53      ** PAGER_RES
36960 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68  ERVED state. Oth
36970 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
36980 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
36990 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
369a0 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61    ** The busy-ha
369b0 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76  ndler is not inv
369c0 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20  oked if another 
369d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61  connection alrea
369e0 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64  dy.      ** hold
369f0 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  s the write-lock
36a00 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  . If possible, t
36a10 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
36a20 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20  ill call it..   
36a30 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
36a40 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
36a50 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
36a60 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
36a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36a80 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
36a90 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
36aa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
36ab0 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
36ac0 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a  arameter.      *
36ad0 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
36ae0 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72  immediately upgr
36af0 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45  ade this to an E
36b00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
36b10 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79  he.      ** busy
36b20 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
36b30 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
36b40 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
36b50 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
36b60 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
36b70 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
36b80 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
36b90 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   lock..      */.
36ba0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
36bb0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
36bc0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
36bd0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36be0 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67  ITE_OK && exFlag
36bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
36c00 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
36c10 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
36c20 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
36c30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
36c40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36c50 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  K ){.      /* Ch
36c60 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c  ange to WRITER_L
36c70 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20  OCKED state..   
36c80 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
36c90 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67  AL mode sets Pag
36ca0 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47  er.eState to PAG
36cb0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
36cc0 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20   or CACHEMOD.   
36cd0 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61     ** when it ha
36ce0 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61  s an open transa
36cf0 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72  ction, but never
36d00 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e   to DBMOD or FIN
36d10 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20  ISHED..      ** 
36d20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
36d30 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73 20  in those states 
36d40 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
36d50 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20   back savepoint 
36d60 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
36d70 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20  ctions may copy 
36d80 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75  data from the su
36d90 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  b-journal into t
36da0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
36db0 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65     ** file as we
36dc0 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70  ll as into the p
36dd0 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63 68  age cache. Which
36de0 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72   would be incorr
36df0 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  ect in .      **
36e00 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20   WAL mode..     
36e10 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
36e20 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
36e30 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a  _WRITER_LOCKED;.
36e40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
36e50 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
36e60 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
36e70 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
36e80 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
36e90 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
36ea0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
36eb0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
36ec0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
36ed0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
36ee0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
36ef0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36f00 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
36f10 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
36f20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
36f30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
36f40 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36f50 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
36f60 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  KED );.    asser
36f70 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
36f80 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
36f90 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
36fa0 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE(("TRANSACTION
36fb0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
36fc0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74  pPager)));.  ret
36fd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
36fe0 20 57 72 69 74 65 20 70 61 67 65 20 70 50 67 20   Write page pPg 
36ff0 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
37000 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
37010 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
37020 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
37030 69 6e 74 20 70 61 67 65 72 41 64 64 50 61 67 65  int pagerAddPage
37040 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61  ToRollbackJourna
37050 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  l(PgHdr *pPg){. 
37060 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
37070 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
37080 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 63 6b  int rc;.  u32 ck
37090 73 75 6d 3b 0a 20 20 63 68 61 72 20 2a 70 44 61  sum;.  char *pDa
370a0 74 61 32 3b 0a 20 20 69 36 34 20 69 4f 66 66 20  ta2;.  i64 iOff 
370b0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
370c0 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 65 20 73  lOff;..  /* We s
370d0 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
370e0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
370f0 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
37100 68 61 74 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  hat.  ** contain
37110 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  s the database l
37120 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ocks.  The follo
37130 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69  wing assert veri
37140 66 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  fies.  ** that w
37150 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 61  e do not. */.  a
37160 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
37170 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
37180 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73  pPager) );..  as
37190 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
371a0 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72  urnalHdr<=pPager
371b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
371c0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
371d0 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67   pPg->pData, pPg
371e0 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
371f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
37200 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  KPT, pData2);.  
37210 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
37220 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
37230 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a 20  )pData2);..  /* 
37240 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
37250 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
37260 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75  occurs while jou
37270 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 2a  rnalling the.  *
37280 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
37290 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
372a0 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
372b0 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
372c0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
372d0 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
372e0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
372f0 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
37300 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f  n.  ** playback_
37310 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
37320 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
37330 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
37340 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69 6e  restored.  ** in
37350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37360 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
37370 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
37380 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
37390 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
373a0 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
373b0 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
373c0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
373d0 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  YNC;..  rc = wri
373e0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
373f0 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d  >jfd, iOff, pPg-
37400 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  >pgno);.  if( rc
37410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
37420 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
37430 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
37440 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
37450 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
37460 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20  Size, iOff+4);. 
37470 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37480 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37490 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
374a0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
374b0 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  iOff+pPager->pag
374c0 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b  eSize+4, cksum);
374d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
374e0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
374f0 3b 0a 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a  ;..  IOTRACE(("J
37500 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
37510 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
37520 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
37530 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
37540 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
37550 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 50  >pageSize));.  P
37560 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
37570 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
37580 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 54 52  ount);.  PAGERTR
37590 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE(("JOURNAL %d
375a0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
375b0 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
375c0 6e 22 2c 0a 20 20 20 20 20 20 20 50 41 47 45 52  n",.       PAGER
375d0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
375e0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 28  >pgno, .       (
375f0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
37600 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
37610 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
37620 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 70 50 61  h(pPg)));..  pPa
37630 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
37640 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70  += 8 + pPager->p
37650 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  ageSize;.  pPage
37660 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61 73 73  r->nRec++;.  ass
37670 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
37680 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
37690 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
376a0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
376b0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
376c0 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65  gno);.  testcase
376d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
376e0 45 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EM );.  assert( 
376f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
37700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
37710 4d 20 29 3b 0a 20 20 72 63 20 7c 3d 20 61 64 64  M );.  rc |= add
37720 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
37730 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
37740 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
37750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
37760 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
37770 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
37780 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
37790 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70   a single data p
377a0 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
377b0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72  . The page is wr
377c0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
377d0 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ** main journal 
377e0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61  or sub-journal a
377f0 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74  s required. If t
37800 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
37810 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f  en into.** one o
37820 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20  f the journals, 
37830 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
37840 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
37850 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49  the .** Pager.pI
37860 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
37870 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
37880 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
37890 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f  int bitvecs.** o
378a0 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70  f any open savep
378b0 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72  oints as appropr
378c0 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
378d0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
378e0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
378f0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
37900 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
37910 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37920 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
37930 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c  tine is not call
37940 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74  ed unless a writ
37950 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
37960 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20  s already .  ** 
37970 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68  been started. Th
37980 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
37990 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
379a0 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f   open at this po
379b0 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  int..  ** It is 
379c0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
379d0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
379e0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
379f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37a00 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37a10 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  KED.       || pP
37a20 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37a30 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
37a40 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
37a50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37a60 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
37a70 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
37a80 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37a90 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
37aa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37ab0 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  errCode==0 );.  
37ac0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37ad0 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
37ae0 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
37af0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
37b00 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
37b10 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67  o be opened. Hig
37b20 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
37b30 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  es have already.
37b40 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68    ** obtained th
37b50 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b  e necessary lock
37b60 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77  s to begin the w
37b70 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
37b80 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72  , but the.  ** r
37b90 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
37ba0 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65  might not yet be
37bb0 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e   open. Open it n
37bc0 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ow if this is th
37bd0 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e case..  **.  *
37be0 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  * This is done b
37bf0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71  efore calling sq
37c00 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
37c10 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61  irty() on the pa
37c20 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ge. .  ** Otherw
37c30 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65 20  ise, if it were 
37c40 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69  done after calli
37c50 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
37c60 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65  MakeDirty(), the
37c70 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
37c80 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20  might occur and 
37c90 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20  the pager would 
37ca0 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45 52  end up in WRITER
37cb0 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20  _LOCKED state.  
37cc0 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d 61  ** with pages ma
37cd0 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69 6e  rked as dirty in
37ce0 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f   the cache..  */
37cf0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
37d00 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37d10 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  TER_LOCKED ){.  
37d20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
37d30 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
37d40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
37d50 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
37d60 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
37d70 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
37d80 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
37d90 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61  _CACHEMOD );.  a
37da0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
37db0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37dc0 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  ) );..  /* Mark 
37dd0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73  the page that is
37de0 20 61 62 6f 75 74 20 74 6f 20 62 65 20 6d 6f 64   about to be mod
37df0 69 66 69 65 64 20 61 73 20 64 69 72 74 79 2e 20  ified as dirty. 
37e00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
37e10 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
37e20 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 72 6f 6c  ;..  /* If a rol
37e30 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 69 73  lback journal is
37e40 20 69 6e 20 75 73 65 2c 20 74 68 65 6d 20 6d 61   in use, them ma
37e50 6b 65 20 73 75 72 65 20 74 68 65 20 70 61 67 65  ke sure the page
37e60 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 0a 20   that is about. 
37e70 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 69 73   ** to change is
37e80 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
37e90 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20   journal, or if 
37ea0 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6e 65  the page is a ne
37eb0 77 20 70 61 67 65 20 6f 66 66 0a 20 20 2a 2a 20  w page off.  ** 
37ec0 74 68 65 6e 20 65 6e 64 20 6f 66 20 74 68 65 20  then end of the 
37ed0 66 69 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  file, make sure 
37ee0 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
37ef0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 2e  PGHDR_NEED_SYNC.
37f00 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
37f10 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
37f20 6e 61 6c 21 3d 30 29 20 3d 3d 20 69 73 4f 70 65  nal!=0) == isOpe
37f30 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
37f40 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
37f50 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 0a 20 20  pInJournal!=0.  
37f60 20 26 26 20 73 71 6c 69 74 65 33 42 69 74 76 65   && sqlite3Bitve
37f70 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 50 61  cTestNotNull(pPa
37f80 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
37f90 20 70 50 67 2d 3e 70 67 6e 6f 29 3d 3d 30 0a 20   pPg->pgno)==0. 
37fa0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
37fb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
37fc0 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  er)==0 );.    if
37fd0 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  ( pPg->pgno<=pPa
37fe0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
37ff0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
38000 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c  gerAddPageToRoll
38010 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 70 50 67 29  backJournal(pPg)
38020 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
38030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
38040 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
38050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
38060 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  e{.      if( pPa
38070 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
38080 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
38090 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
380a0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
380b0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
380c0 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  }.      PAGERTRA
380d0 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
380e0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
380f0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
38100 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
38110 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
38120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
38130 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
38140 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
38150 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ));.    }.  }.. 
38160 20 2f 2a 20 54 68 65 20 50 47 48 44 52 5f 44 49   /* The PGHDR_DI
38170 52 54 59 20 62 69 74 20 69 73 20 73 65 74 20 61  RTY bit is set a
38180 62 6f 76 65 20 77 68 65 6e 20 74 68 65 20 70 61  bove when the pa
38190 67 65 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  ge was added to 
381a0 74 68 65 20 64 69 72 74 79 2d 6c 69 73 74 0a 20  the dirty-list. 
381b0 20 2a 2a 20 61 6e 64 20 62 65 66 6f 72 65 20 77   ** and before w
381c0 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20  riting the page 
381d0 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
381e0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 61 69 74  k journal.  Wait
381f0 20 75 6e 74 69 6c 20 6e 6f 77 2c 0a 20 20 2a 2a   until now,.  **
38200 20 61 66 74 65 72 20 74 68 65 20 70 61 67 65 20   after the page 
38210 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
38220 66 75 6c 6c 79 20 6a 6f 75 72 6e 61 6c 6c 65 64  fully journalled
38230 2c 20 62 65 66 6f 72 65 20 73 65 74 74 69 6e 67  , before setting
38240 20 74 68 65 0a 20 20 2a 2a 20 50 47 48 44 52 5f   the.  ** PGHDR_
38250 57 52 49 54 45 41 42 4c 45 20 62 69 74 20 74 68  WRITEABLE bit th
38260 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  at indicates tha
38270 74 20 74 68 65 20 70 61 67 65 20 63 61 6e 20 62  t the page can b
38280 65 20 73 61 66 65 6c 79 20 6d 6f 64 69 66 69 65  e safely modifie
38290 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66  d..  */.  pPg->f
382a0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 57 52  lags |= PGHDR_WR
382b0 49 54 45 41 42 4c 45 3b 0a 20 20 0a 20 20 2f 2a  ITEABLE;.  .  /*
382c0 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
382d0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
382e0 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
382f0 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a  s not in it,.  *
38300 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
38310 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73   page into the s
38320 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
38330 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
38340 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
38350 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75  0 ){.    rc = su
38360 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65  bjournalPageIfRe
38370 71 75 69 72 65 64 28 70 50 67 29 3b 0a 20 20 7d  quired(pPg);.  }
38380 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
38390 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
383a0 61 6e 64 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  and return. */. 
383b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
383c0 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
383d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
383e0 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
383f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
38400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
38410 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f 66 20  is a variant of 
38420 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
38430 65 28 29 20 74 68 61 74 20 72 75 6e 73 20 77 68  e() that runs wh
38440 65 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  en the sector si
38450 7a 65 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20  ze.** is larger 
38460 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 73 69  than the page si
38470 7a 65 2e 20 20 53 51 4c 69 74 65 20 6d 61 6b 65  ze.  SQLite make
38480 73 20 74 68 65 20 28 72 65 61 73 6f 6e 61 62 6c  s the (reasonabl
38490 65 29 20 61 73 73 75 6d 70 74 69 6f 6e 20 74 68  e) assumption th
384a0 61 74 0a 2a 2a 20 61 6c 6c 20 62 79 74 65 73 20  at.** all bytes 
384b0 6f 66 20 61 20 73 65 63 74 6f 72 20 61 72 65 20  of a sector are 
384c0 77 72 69 74 74 65 6e 20 74 6f 67 65 74 68 65 72  written together
384d0 20 62 79 20 68 61 72 64 77 61 72 65 2e 20 20 48   by hardware.  H
384e0 65 6e 63 65 2c 20 61 6c 6c 20 62 79 74 65 73 20  ence, all bytes 
384f0 6f 66 0a 2a 2a 20 61 20 73 65 63 74 6f 72 20 6e  of.** a sector n
38500 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
38510 6c 6c 65 64 20 69 6e 20 63 61 73 65 20 6f 66 20  lled in case of 
38520 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 69 6e 20  a power loss in 
38530 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
38540 20 61 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20   a write..**.** 
38550 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 73 65 63  Usually, the sec
38560 74 6f 72 20 73 69 7a 65 20 69 73 20 6c 65 73 73  tor size is less
38570 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
38580 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2c  o the page size,
38590 20 69 6e 20 77 68 69 63 68 0a 2a 2a 20 63 61 73   in which.** cas
385a0 65 20 70 61 67 65 73 20 63 61 6e 20 62 65 20 69  e pages can be i
385b0 6e 64 69 76 69 64 75 61 6c 6c 79 20 77 72 69 74  ndividually writ
385c0 74 65 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ten.  This routi
385d0 6e 65 20 6f 6e 6c 79 20 72 75 6e 73 20 69 6e 20  ne only runs in 
385e0 74 68 65 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e  the.** exception
385f0 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 74 68  al case where th
38600 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  e page size is s
38610 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
38620 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2f 0a  sector size..*/.
38630 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
38640 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72  INLINE int pager
38650 57 72 69 74 65 4c 61 72 67 65 53 65 63 74 6f 72  WriteLargeSector
38660 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
38670 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
38680 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
38690 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
386a0 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
386b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
386c0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
386d0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
386e0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file