/ Hex Artifact Content
Login

Artifact 737025a2e7457ae7cfd4fe1f0cc69f69d88b29b4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20    u8 syncFlags; 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77  SYNC_FULL otherw
7230: 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ise */.  u8 temp
7240: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
7250: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
7260: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
7270: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
7280: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
7290: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
72a0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
72b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
72c0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72e0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
72f0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
7300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20  **********.  ** 
7350: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7360: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
7370: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7380: 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72   that change dur
7390: 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ing.  ** routine
73a0: 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73   opertion.  Clas
73b0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
73c0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
73d0: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
73e0: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
73f0: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7400: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7410: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7420: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7430: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7440: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7450: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7460: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
7470: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
7480: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
7490: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
74a0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
74b0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
74c0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
74d0: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
74e0: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
74f0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7500: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7510: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7520: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7530: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7550: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7560: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
7570: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
7580: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
75a0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
75b0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
75c0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
75d0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
75e0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
75f0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7600: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7610: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7630: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7640: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7650: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7660: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
7670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7680: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
7690: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
76a0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 64  n-zero */.  u8 d
76b0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20 20  oNotSyncSpill;  
76c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
76d0: 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68 61  t do a spill tha
76e0: 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c 20  t requires jrnl 
76f0: 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75 62  sync */.  u8 sub
7700: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
7710: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7720: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
7730: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
7740: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7760: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7770: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7780: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
7790: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
77b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
77c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
77d0: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
77e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
77f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
7800: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7810: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48  le */.  Pgno dbH
7820: 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  intSize;        
7830: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73      /* Value pas
7840: 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a  sed to FCNTL_SIZ
7850: 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20  E_HINT call */. 
7860: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7880: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
7890: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
78a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
78d0: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
78e0: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
78f0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
7900: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
7910: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
7920: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
7930: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
7940: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
7970: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
7980: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7990: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
79a0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
79b0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
79c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
79d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
79e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
79f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7a00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7a10: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7a20: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7a30: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7a40: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7a50: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7a70: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7a80: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a90: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
7aa0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
7ab0: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
7ac0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7ad0: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
7ae0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7af0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
7b00: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
7b10: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
7b20: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
7b30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
7b40: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
7b50: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
7b60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
7b70: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
7b80: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
7b90: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
7ba0: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
7bb0: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
7bc0: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
7bd0: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bf0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
7c00: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
7c10: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  [] */.  char dbF
7c20: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
7c30: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
7c40: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
7c50: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
7c60: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
7c70: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
7c80: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
7c90: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
7cf0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
7d00: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
7d10: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
7d20: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
7d30: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
7d40: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
7d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7d60: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
7d70: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
7d80: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
7d90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7da0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
7db0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
7dc0: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
7dd0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
7de0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
7df0: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
7e00: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
7e10: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e30: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7e40: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
7e50: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
7e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7e70: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
7e80: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
7e90: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
7ea0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7eb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
7ec0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
7ed0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
7ee0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
7ef0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
7f00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
7f10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7f20: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
7f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7f40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
7f50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7f60: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
7f70: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
7f80: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
7f90: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
7fa0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
7fb0: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
7fc0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
7fd0: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
7fe0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
7ff0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
8000: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
8010: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
8020: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
8030: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
8040: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
8050: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
8060: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
8070: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
8080: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
8090: 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  e*); /* Call thi
80a0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
80b0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
80c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
80d0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
80e0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
80f0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
8100: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
8110: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
8120: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ta */.  void (*x
8130: 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76  CodecSizeChng)(v
8140: 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f  oid*,int,int); /
8150: 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65  * Notify of page
8160: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f   size changes */
8170: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8180: 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20  Free)(void*);   
8190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
81a0: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20  tructor for the 
81b0: 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20  codec */.  void 
81c0: 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20  *pCodec;        
81d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
81e0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
81f0: 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f  ec... methods */
8200: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
8210: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
8220: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
8230: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
8240: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
8250: 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  se */.  PCache *
8260: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
8270: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8280: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
8290: 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ect */.#ifndef S
82a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
82b0: 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20   Wal *pWal;     
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82d0: 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  Write-ahead log 
82e0: 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c  used by "journal
82f0: 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20  _mode=wal" */.  
8300: 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20  char *zWal;     
8310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8320: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69  ile name for wri
8330: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a  te-ahead log */.
8340: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
8350: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
8360: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
8370: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
8380: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
8390: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
83a0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
83b0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
83c0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
83d0: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
83e0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
83f0: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
8400: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8410: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
8420: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
8430: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8440: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8450: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
8460: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
8470: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
8480: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
8490: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
84a0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
84b0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
84c0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
84d0: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
84e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
84f0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
8500: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
8510: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
8520: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8530: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
8540: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
8550: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
8560: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
8570: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
8580: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
8590: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
85a0: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
85b0: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
85c0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
85d0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
85e0: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
85f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
8600: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
8610: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
8620: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8630: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
8640: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
8650: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
8660: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
8670: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
8680: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
8690: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
86a0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
86b0: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
86c0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
86d0: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
86e0: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
86f0: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
8700: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
8710: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
8720: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
8730: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
8740: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
8750: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
8760: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
8770: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8780: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
8790: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
87a0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
87b0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
87c0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
87d0: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
87e0: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
87f0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
8800: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
8810: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
8820: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
8830: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
8840: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
8850: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
8860: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
8870: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
8880: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
8890: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
88a0: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
88b0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
88c0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
88d0: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
88e0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
88f0: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
8900: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
8910: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
8920: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
8930: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
8940: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
8950: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
8960: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
8970: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
8980: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
8990: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
89a0: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
89b0: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
89c0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
89d0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
89e0: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
89f0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
8a00: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
8a10: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
8a20: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
8a30: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
8a40: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
8a50: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
8a60: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
8a70: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
8a80: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
8a90: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
8aa0: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
8ab0: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
8ac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
8ad0: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
8ae0: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
8af0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
8b00: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
8b10: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
8b20: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8b30: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
8b40: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
8b50: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
8b60: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
8b70: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
8b80: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
8b90: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
8ba0: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
8bb0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
8bc0: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
8bd0: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
8be0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
8bf0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
8c00: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
8c10: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
8c20: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
8c30: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
8c40: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
8c50: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
8c60: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
8c70: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
8c80: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
8c90: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
8ca0: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
8cb0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
8cc0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
8cd0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
8ce0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
8cf0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
8d00: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
8d10: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
8d20: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
8d30: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
8d40: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
8d50: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
8d60: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
8d70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
8d80: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
8d90: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
8da0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
8db0: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
8dc0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
8dd0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
8de0: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
8df0: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
8e00: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
8e10: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
8e20: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
8e30: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
8e40: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
8e50: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
8e60: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
8e70: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
8e80: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
8e90: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
8ea0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
8eb0: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
8ec0: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
8ed0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
8ee0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
8ef0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
8f00: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
8f10: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
8f20: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
8f30: 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65 73   this pager uses
8f40: 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c   a write-ahead l
8f50: 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  og instead of th
8f60: 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62  e usual.** rollb
8f70: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68  ack journal. Oth
8f80: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
8f90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8fa0: 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63 20  OMIT_WAL.static 
8fb0: 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c 28  int pagerUseWal(
8fc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8fd0: 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
8fe0: 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65  ->pWal!=0);.}.#e
8ff0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
9000: 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23 20  erUseWal(x) 0.# 
9010: 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c  define pagerRoll
9020: 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20 64  backWal(x) 0.# d
9030: 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46 72  efine pagerWalFr
9040: 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29 20  ames(v,w,x,y,z) 
9050: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9060: 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
9070: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (z) SQLITE_OK.# 
9080: 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69  define pagerBegi
9090: 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
90a0: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (z) SQLITE_OK.#e
90b0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
90c0: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67  EBUG ./*.** Usag
90d0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  e:.**.**   asser
90e0: 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
90f0: 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
9100: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9110: 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61  tion runs many a
9120: 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f  sserts to try to
9130: 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65   find inconsiste
9140: 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ncies in.** the 
9150: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
9160: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
9170: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
9180: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
9190: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
91a0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
91b0: 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65  = p;..  /* State
91c0: 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20   must be valid. 
91d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
91e0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
91f0: 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  EN.       || p->
9200: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
9210: 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70  ADER.       || p
9220: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9230: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
9240: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9250: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9260: 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
9270: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9280: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9290: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
92a0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
92b0: 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20  ER_FINISHED.    
92c0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
92d0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29  =PAGER_ERROR.  )
92e0: 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65  ;..  /* Regardle
92f0: 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ss of the curren
9300: 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d  t state, a temp-
9310: 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  file connection 
9320: 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20  always behaves. 
9330: 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73   ** as if it has
9340: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
9350: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
9360: 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65  se file. It neve
9370: 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74  r updates.  ** t
9380: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
9390: 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20  r field, so the 
93a0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
93b0: 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73  flag is always s
93c0: 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
93d0: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
93e0: 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  0 || p->eLock==E
93f0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
9400: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
9410: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
9420: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9430: 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Done );..  /* If
9440: 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20   the useJournal 
9450: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  flag is clear, t
9460: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9470: 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a  must be "OFF". .
9480: 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
9490: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
94a0: 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e  "OFF", the journ
94b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74  al file must not
94c0: 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   be open..  */. 
94d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
94e0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
94f0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9500: 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  | p->useJournal 
9510: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9520: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
9530: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9540: 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d  FF || !isOpen(p-
9550: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9560: 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20  heck that MEMDB 
9570: 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20  implies noSync. 
9580: 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  And an in-memory
9590: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
95a0: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73  .  ** this means
95b0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
95c0: 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20  ger performs no 
95d0: 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61  IO at all, it ca
95e0: 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a  nnot encounter .
95f0: 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49    ** either SQLI
9600: 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
9610: 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72  TE_FULL during r
9620: 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65  ollback or while
9630: 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a   finalizing .  *
9640: 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * a journal file
9650: 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20  . (although the 
9660: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9670: 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  l implementation
9680: 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72   may .  ** retur
9690: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
96a0: 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a  OMEM while the j
96b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
96c0: 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49  eing written). I
96d0: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65  t .  ** is there
96e0: 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c  fore not possibl
96f0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
9700: 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  ry pager to ente
9710: 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a  r the ERROR .  *
9720: 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  * state..  */.  
9730: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
9740: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
9750: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
9760: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9770: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9780: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
9790: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
97a0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
97b0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
97c0: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
97d0: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
97e0: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
97f0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
9800: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9810: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
9820: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
9830: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
9840: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
9850: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
9860: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
9870: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
9880: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9890: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
98a0: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
98b0: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
98c0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
98d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
98e0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
98f0: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
9900: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
9910: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
9920: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
9930: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
9940: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9950: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9960: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9970: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
9980: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
9990: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
99a0: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
99b0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
99c0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
99d0: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
99e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
99f0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9a00: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9a10: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9a20: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9a30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9a40: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
9a50: 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64 6c  CK || p->noReadl
9a60: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ock );.      bre
9a70: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9a80: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9a90: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9aa0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9ab0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9ac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ad0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9ae0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9af0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9b00: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9b10: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9b20: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9b30: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9b40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9b50: 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72  ->dbSize==pPager
9b60: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
9b70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9b80: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9b90: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ==pPager->dbFile
9ba0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
9bb0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9bc0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9bd0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
9be0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9bf0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
9c00: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
9c10: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9c20: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
9c30: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
9c40: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9c50: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9c60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9c70: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9c80: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9c90: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9ca0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9cb0: 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
9cc0: 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72  ble that if jour
9cd0: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72  nal_mode=wal her
9ce0: 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74  e that neither t
9cf0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
9d00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74  urnal file nor t
9d10: 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20  he WAL file are 
9d20: 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65  open. This happe
9d30: 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20  ns during.      
9d40: 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
9d50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
9d60: 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a   switches from j
9d70: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a  ournal_mode=off.
9d80: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f          ** to jo
9d90: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a  urnal_mode=wal..
9da0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9db0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9dc0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9dd0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  CK );.        as
9de0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
9df0: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
9e00: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9e10: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9e20: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9e30: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
9e40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9e50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
9e60: 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  AL .        );. 
9e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9e80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9e90: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9ea0: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9eb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9ec0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9ed0: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
9ee0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ize );.      bre
9ef0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9f00: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9f10: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9f20: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9f30: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
9f40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9f50: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9f60: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9f70: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
9f80: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
9f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9fa0: 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f  Lock>=EXCLUSIVE_
9fb0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9fc0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
9fd0: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
9fe0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9ff0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a000: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
a010: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a020: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a030: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
a040: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
a050: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a060: 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65  bOrigSize<=pPage
a070: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a080: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a090: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a0a0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20  ITER_FINISHED:. 
a0b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a0c0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
a0d0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a0e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a0f0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a100: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a110: 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
a120: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
a130: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a140: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a150: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a160: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a170: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a180: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a190: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a1a0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a1b0: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a1c0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a1d0: 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a  se PAGER_ERROR:.
a1e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d        /* There m
a1f0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
a200: 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
a210: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
a220: 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20   pager if.      
a230: 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  ** in ERROR stat
a240: 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  e. Otherwise the
a250: 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61   pager should ha
a260: 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70  ve already dropp
a270: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
a280: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a   to OPEN state..
a290: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
a2a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a2b0: 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
a2c0: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a2d0: 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
a2e0: 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
a2f0: 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20  >pPCache)>0 );. 
a300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
a310: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
a320: 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
a330: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
a340: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a  f SQLITE_DEBUG .
a350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
a360: 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61  ointer to a huma
a370: 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e  n readable strin
a380: 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75  g in a static bu
a390: 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
a3a0: 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ng the state of 
a3b0: 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
a3c0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
a3d0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20  gument. This.** 
a3e0: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
a3f0: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65  e used within de
a400: 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61  buggers. For exa
a410: 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65  mple, as an alte
a420: 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70  rnative.** to "p
a430: 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e  rint *pPager" in
a440: 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62   gdb:.**.** (gdb
a450: 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70  ) printf "%s", p
a460: 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65  rint_pager_state
a470: 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74  (pPager).*/.stat
a480: 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70  ic char *print_p
a490: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
a4a0: 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *p){.  static c
a4b0: 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a  har zRet[1024];.
a4c0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
a4d0: 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a  ntf(1024, zRet,.
a4e0: 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a        "Filename:
a4f0: 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20        %s\n".    
a500: 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20    "State:       
a510: 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c    %s errCode=%d\
a520: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20  n".      "Lock: 
a530: 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20           %s\n". 
a540: 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f       "Locking mo
a550: 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  de:  locking_mod
a560: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a  e=%s\n".      "J
a570: 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f  ournal mode:  jo
a580: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22  urnal_mode=%s\n"
a590: 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20  .      "Backing 
a5a0: 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d  store: tempFile=
a5b0: 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a  %d memDb=%d useJ
a5c0: 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20  ournal=%d\n".   
a5d0: 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20     "Journal:    
a5e0: 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c     journalOff=%l
a5f0: 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c  ld journalHdr=%l
a600: 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a  ld\n".      "Siz
a610: 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69  e:          dbsi
a620: 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65  ze=%d dbOrigSize
a630: 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25  =%d dbFileSize=%
a640: 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  d\n".      , p->
a650: 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20  zFilename.      
a660: 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  , p->eState==PAG
a670: 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20  ER_OPEN         
a680: 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20     ? "OPEN" :.  
a690: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a6a0: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20  =PAGER_READER   
a6b0: 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52         ? "READER
a6c0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a6d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
a6e0: 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22  TER_LOCKED   ? "
a6f0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a  WRITER_LOCKED" :
a700: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a710: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a720: 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49  _CACHEMOD ? "WRI
a730: 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a  TER_CACHEMOD" :.
a740: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a750: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
a760: 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54  DBMOD    ? "WRIT
a770: 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20  ER_DBMOD" :.    
a780: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a790: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
a7a0: 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46  SHED ? "WRITER_F
a7b0: 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20  INISHED" :.     
a7c0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7d0: 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20  GER_ERROR       
a7e0: 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20      ? "ERROR" : 
a7f0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
a800: 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64  , (int)p->errCod
a810: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f  e.      , p->eLo
a820: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  ck==NO_LOCK     
a830: 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20      ? "NO_LOCK" 
a840: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
a850: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
a860: 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22  K   ? "RESERVED"
a870: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a880: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a890: 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56  OCK  ? "EXCLUSIV
a8a0: 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  E" :.        p->
a8b0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
a8c0: 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44  CK     ? "SHARED
a8d0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a8e0: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
a8f0: 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e  CK    ? "UNKNOWN
a900: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
a910: 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69      , p->exclusi
a920: 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73  veMode ? "exclus
a930: 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a  ive" : "normal".
a940: 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e        , p->journ
a950: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a960: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
a970: 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a     ? "memory" :.
a980: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
a990: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a9a0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
a9b0: 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20     ? "off" :.   
a9c0: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
a9d0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a9e0: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
a9f0: 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20  ? "delete" :.   
aa00: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
aa10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
aa20: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
aa30: 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20  ? "persist" :.  
aa40: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
aa50: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
aa60: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
aa70: 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a   ? "truncate" :.
aa80: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
aa90: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aaa0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
aab0: 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65     ? "wal" : "?e
aac0: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28  rror?".      , (
aad0: 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c  int)p->tempFile,
aae0: 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20   (int)p->memDb, 
aaf0: 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e  (int)p->useJourn
ab00: 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  al.      , p->jo
ab10: 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75  urnalOff, p->jou
ab20: 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20  rnalHdr.      , 
ab30: 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20  (int)p->dbSize, 
ab40: 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69  (int)p->dbOrigSi
ab50: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69  ze, (int)p->dbFi
ab60: 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72  leSize.  );..  r
ab70: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
ab80: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
ab90: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
aba0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
abb0: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
abc0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
abd0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
abe0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
abf0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
ac00: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
ac10: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
ac20: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
ac30: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
ac40: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
ac50: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
ac60: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
ac70: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
ac80: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
ac90: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
aca0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
acb0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
acc0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
acd0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
ace0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
acf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
ad00: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
ad10: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67  gHdr *pPg){.  Pg
ad20: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
ad30: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
ad40: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
ad50: 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  er;.  int i;.  f
ad60: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72  or(i=0; i<pPager
ad70: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b  ->nSavepoint; i+
ad80: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
ad90: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
ada0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
adb0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  i];.    if( p->n
adc0: 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d  Orig>=pgno && 0=
add0: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  =sqlite3BitvecTe
ade0: 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  st(p->pInSavepoi
adf0: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
ae00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
ae10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ae20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
ae30: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
ae40: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
ae50: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
ae60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
ae70: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
ae80: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
ae90: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
aea0: 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61  vecTest(pPg->pPa
aeb0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
aec0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a   pPg->pgno);.}..
aed0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
aee0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
aef0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
af00: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
af10: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
af20: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
af30: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
af40: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
af50: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
af60: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
af70: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
af80: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
af90: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
afa0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
afb0: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
afc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
afd0: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
afe0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
aff0: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
b000: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
b010: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
b020: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
b030: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
b040: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
b050: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b060: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
b070: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
b080: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
b090: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b0a0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
b0b0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
b0c0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
b0d0: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
b0e0: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
b0f0: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
b100: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
b110: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a  yte((u8*)A,B)...
b120: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b130: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b140: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
b150: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
b160: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
b170: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
b180: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
b190: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b1a0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
b1b0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
b1c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b1d0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b1e0: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
b1f0: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
b200: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
b210: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
b220: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
b230: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
b240: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
b250: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
b260: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
b270: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
b280: 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48  NO_LOCK.** or SH
b290: 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72  ARED_LOCK. Regar
b2a0: 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
b2b0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c   or not the call
b2c0: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
b2d0: 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74   succeeds, set t
b2e0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
b2f0: 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68  ariable to match
b300: 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29   the (attempted)
b310: 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   new lock..**.**
b320: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
b330: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
b340: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
b350: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
b360: 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20  n is.** called, 
b370: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
b380: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
b390: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
b3a0: 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f  ine of .** UNKNO
b3b0: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
b3c0: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
b3d0: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
b3e0: 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  t pagerUnlockDb(
b3f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b400: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
b410: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b420: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
b430: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
b440: 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  de || pPager->eL
b450: 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock==eLock );.  
b460: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e  assert( eLock==N
b470: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  O_LOCK || eLock=
b480: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b490: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21    assert( eLock!
b4a0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65  =NO_LOCK || page
b4b0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
b4c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
b4d0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
b4e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
b4f0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  ager->eLock>=eLo
b500: 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ck );.    rc = s
b510: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
b520: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
b530: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
b540: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
b550: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
b560: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
b570: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
b580: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b590: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
b5a0: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
b5b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b5c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
b5d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b5e0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
b5f0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
b600: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
b610: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
b620: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
b630: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
b640: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
b650: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
b660: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
b670: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
b680: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
b690: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b6a0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b6b0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b6c0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
b6d0: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
b6e0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
b6f0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
b700: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
b710: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
b720: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
b730: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
b740: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
b750: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
b760: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
b770: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
b780: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
b790: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
b7a0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
b7b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b7c0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
b7d0: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
b7e0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
b7f0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
b800: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
b810: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
b820: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
b830: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
b840: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
b850: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
b860: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
b870: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
b880: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b890: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
b8a0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
b8b0: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
b8c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
b8d0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b8e0: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b8f0: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
b900: 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
b910: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
b920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b930: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b940: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
b950: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
b960: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
b970: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
b980: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
b990: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
b9a0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
b9b0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
b9c0: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
b9d0: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
b9e0: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
b9f0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
ba00: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
ba10: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
ba20: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
ba30: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
ba40: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
ba50: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
ba60: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
ba70: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
ba80: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
ba90: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
baa0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  size..**.** The 
bab0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
bac0: 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62  also always enab
bad0: 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  led for temporar
bae0: 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a  y files. It is.*
baf0: 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61  * an error to ca
bb00: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
bb10: 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70   if pPager is op
bb20: 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  ened on an in-me
bb30: 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
bb40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
bb50: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
bb60: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
bb70: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
bb80: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
bb90: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
bba0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
bbb0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
bbc0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
bbd0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
bbe0: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
bbf0: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
bc00: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
bc10: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
bc20: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
bc30: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
bc40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bc50: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
bc60: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
bc70: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
bc80: 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20     int dc;      
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
bcb0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
bcc0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f  /.    int nSecto
bcd0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
bce0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
bcf0: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e  r size */.    in
bd00: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
bd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
bd40: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
bd50: 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  );.    dc = sqli
bd60: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
bd70: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
bd80: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63  r->fd);.    nSec
bd90: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
bda0: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a  ctorSize;.    sz
bdb0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
bdc0: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
bdd0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
bde0: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
bdf0: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
be00: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
be10: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
be20: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
be30: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
be40: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
be50: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
be60: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
be70: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
be80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
be90: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
bea0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
beb0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
bec0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
bed0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
bee0: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
bef0: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
bf00: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
bf10: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
bf20: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
bf30: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
bf40: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
bf50: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
bf60: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
bf70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
bf80: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
bf90: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
bfa0: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
bfb0: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
bfc0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
bfd0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
bfe0: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
bff0: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
c000: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
c010: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
c020: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
c030: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
c040: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
c050: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
c060: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
c070: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
c080: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c090: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
c0a0: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
c0b0: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
c0c0: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
c0d0: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
c0e0: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
c0f0: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
c100: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c110: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
c120: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
c130: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
c140: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
c150: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
c160: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
c170: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
c180: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c190: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
c1a0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
c1b0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
c1c0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
c1d0: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
c1e0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
c1f0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
c200: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
c210: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
c220: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
c230: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
c240: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
c250: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
c260: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
c270: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
c280: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
c290: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
c2a0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
c2b0: 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
c2c0: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
c2d0: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
c2e0: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
c2f0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
c300: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
c310: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
c320: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
c330: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
c340: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  (X)  0.#define p
c350: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c360: 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45  h(X).#define CHE
c370: 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69  CK_PAGE(x).#endi
c380: 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45  f  /* SQLITE_CHE
c390: 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a  CK_PAGES */../*.
c3a0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
c3b0: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
c3c0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
c3d0: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
c3e0: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66   open..** This f
c3f0: 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
c400: 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65   to read a maste
c410: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
c420: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ame from the .**
c430: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
c440: 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73   and, if success
c450: 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69  ful, copies it i
c460: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
c470: 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63  ied .** by the c
c480: 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65  aller. See comme
c490: 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d  nts above writeM
c4a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
c4b0: 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a  or the format.**
c4c0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
c4d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c4e0: 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65  file name at the
c4f0: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
c500: 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d  l file..**.** zM
c510: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
c520: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
c530: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
c540: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
c550: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
c560: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
c570: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
c580: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
c590: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
c5a0: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
c5b0: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
c5c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
c5d0: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
c5e0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
c5f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
c600: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
c610: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
c620: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
c630: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
c640: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
c650: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
c660: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
c670: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
c680: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
c690: 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72  *.** If a master
c6a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c6b0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74  me is present at
c6c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c6d0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c  journal.** file,
c6e0: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69   then it is copi
c6f0: 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  ed into the buff
c700: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
c710: 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e   zMaster. A.** n
c720: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
c730: 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  te is appended t
c740: 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c  o the buffer fol
c750: 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65  lowing the maste
c760: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r.** journal fil
c770: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e name..**.** If
c780: 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65   it is determine
c790: 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72  d that no master
c7a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c7b0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a  me is present .*
c7c0: 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20  * zMaster[0] is 
c7d0: 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
c7e0: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
c7f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
c800: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
c810: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
c820: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61   journal file, a
c830: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f  n SQLite.** erro
c840: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
c850: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
c860: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
c870: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  nal(sqlite3_file
c880: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a   *pJrnl, char *z
c890: 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73  Master, u32 nMas
c8a0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
c8d0: 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20  e */.  u32 len; 
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62    /* Length in b
c900: 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ytes of master j
c910: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
c920: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
c930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c940: 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74  otal size in byt
c950: 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  es of journal fi
c960: 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33  le pJrnl */.  u3
c970: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
c980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63           /* MJ c
c990: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65  hecksum value re
c9a0: 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ad from journal 
c9b0: 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
c9e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e   counter */.  un
c9f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
ca00: 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75  ic[8];   /* A bu
ca10: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
ca20: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
ca30: 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20  .  zMaster[0] = 
ca40: 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c  '\0';..  if( SQL
ca50: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
ca60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
ca70: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20  pJrnl, &szJ)).  
ca80: 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c   || szJ<16.   ||
ca90: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
caa0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
cab0: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
cac0: 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d  )).   || len>=nM
cad0: 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c  aster .   || SQL
cae0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
caf0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
cb00: 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29  szJ-12, &cksum))
cb10: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
cb20: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
cb30: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
cb40: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a  gic, 8, szJ-8)).
cb50: 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61     || memcmp(aMa
cb60: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
cb70: 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c  ic, 8).   || SQL
cb80: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
cb90: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
cba0: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
cbb0: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20   szJ-16-len)).  
cbc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
cbd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
cbe0: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
cbf0: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
cc00: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
cc10: 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  */.  for(u=0; u<
cc20: 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63  len; u++){.    c
cc30: 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b  ksum -= zMaster[
cc40: 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  u];.  }.  if( ck
cc50: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
cc60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
cc70: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
cc80: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
cc90: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
cca0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
ccb0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
ccc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
ccd0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
cce0: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
ccf0: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
cd00: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
cd10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
cd20: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
cd30: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
cd40: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
cd50: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65  e..    */.    le
cd60: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61  n = 0;.  }.  zMa
cd70: 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ster[len] = '\0'
cd80: 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  ;.   .  return S
cd90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cda0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  ** Return the of
cdb0: 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74  fset of the sect
cdc0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f  or boundary at o
cdd0: 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  r immediately .*
cde0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
cdf0: 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d  value in pPager-
ce00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73  >journalOff, ass
ce10: 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a  uming a sector .
ce20: 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65  ** size of pPage
ce30: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79  r->sectorSize by
ce40: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  tes..**.** i.e f
ce50: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
ce60: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20   of 512:.**.**  
ce70: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
ce80: 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  f          Retur
ce90: 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d  n value.**   ---
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20      0.**   512  
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30       512.**   10
cf10: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
cf20: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
cf30: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
cf40: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
cf50: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ** .*/.static i6
cf60: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  4 journalHdrOffs
cf70: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
cf80: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
cf90: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
cfa0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cfb0: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
cfc0: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
cfd0: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
cfe0: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
cff0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d000: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
d010: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
d020: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d030: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
d040: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
d050: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
d060: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
d070: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
d080: 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b    return offset;
d090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
d0a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
d0b0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
d0c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d0d0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
d0e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
d0f0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72  o-op if the jour
d100: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  nal file has not
d110: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
d120: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63  .** within the c
d130: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
d140: 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65  on (i.e. if Page
d150: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29  r.journalOff==0)
d160: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75  ..**.** If doTru
d170: 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  ncate is non-zer
d180: 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a  o or the Pager.j
d190: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d1a0: 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73  variable is.** s
d1b0: 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72  et to 0, then tr
d1c0: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
d1d0: 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  al file to zero 
d1e0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f  bytes in size. O
d1f0: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72  therwise,.** zer
d200: 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65  o the 28-byte he
d210: 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72  ader at the star
d220: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
d230: 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72   file. In either
d240: 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68   case, .** if th
d250: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
d260: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
d270: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
d280: 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c   file immediatel
d290: 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74  y .** after writ
d2a0: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
d2b0: 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  g it..**.** If P
d2c0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
d2d0: 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20  Limit is set to 
d2e0: 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d  a positive, non-
d2f0: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a  zero value, and.
d300: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d310: 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a   truncation or z
d320: 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64  eroing described
d330: 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20   above the size 
d340: 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e  of the .** journ
d350: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
d360: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
d370: 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e  this value, then
d380: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
d390: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d3a0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
d3b0: 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54  zeLimit bytes. T
d3c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d3d0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64  does.** not need
d3e0: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f   to be synced fo
d3f0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
d400: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ration..**.** If
d410: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
d420: 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f  urs, abandon pro
d430: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
d440: 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  rn the IO error 
d450: 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  code..** Otherwi
d460: 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  se, return SQLIT
d470: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
d480: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
d490: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
d4a0: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
d4b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
d4c0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
d4f0: 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
d500: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
d510: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
d520: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d530: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
d540: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
d550: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
d560: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
d570: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
d580: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
d590: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
d5a0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
d5b0: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
d5c0: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
d5d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d5e0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
d5f0: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
d600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
d610: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
d620: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
d630: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d640: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
d650: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
d660: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
d670: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
d680: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d690: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
d6a0: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
d6b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
d6c0: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
d6d0: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
d6e0: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
d6f0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  Flags);.    }.. 
d700: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
d710: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
d720: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
d730: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
d740: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
d750: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
d760: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
d770: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
d780: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
d790: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
d7a0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
d7b0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
d7c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
d7d0: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
d7e0: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
d7f0: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
d800: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
d810: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
d820: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
d830: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
d840: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
d850: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
d860: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d870: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
d880: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
d890: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d8a0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
d8b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
d8c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
d8d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
d8e0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
d8f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d900: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
d910: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
d920: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d930: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d940: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
d950: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
d960: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
d970: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d980: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
d990: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
d9a0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
d9b0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
d9c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
d9d0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
d9e0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
d9f0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
da00: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
da10: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
da20: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
da30: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
da40: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
da50: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
da60: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
da70: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
da80: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
da90: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
daa0: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
dab0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
dac0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
dad0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
dae0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
daf0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
db00: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
db10: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
db20: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
db30: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
db40: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
db50: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
db60: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
db70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
db80: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
db90: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
dba0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
dbb0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
dbc0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
dbd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbf0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
dc00: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
dc10: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
dc20: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
dc30: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
dc40: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
dc50: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
dc60: 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  = (u32)pPager->p
dc70: 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20  ageSize;/* Size 
dc80: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
dc90: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
dca0: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
dcd0: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
dce0: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
dcf0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
dd20: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
dd30: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
dd40: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
dd50: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
dd60: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
dd70: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
dd80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
dd90: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
dda0: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
ddb0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
ddc0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
ddd0: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
dde0: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
ddf0: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
de00: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
de10: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
de20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
de30: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
de40: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
de50: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
de60: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
de70: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
de80: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
de90: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
dea0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
deb0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
dec0: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
ded0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
dee0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
def0: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
df00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
df10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
df20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
df30: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
df40: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
df50: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
df60: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
df70: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
df80: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
df90: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
dfa0: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
dfb0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
dfc0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
dfd0: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
dfe0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
dff0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
e000: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
e010: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
e020: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
e030: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
e040: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
e050: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
e060: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
e070: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
e080: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
e090: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
e0a0: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
e0b0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
e0c0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
e0d0: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
e0e0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
e0f0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
e100: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
e110: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
e120: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
e130: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
e140: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
e150: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e160: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
e170: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
e180: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
e190: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
e1a0: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
e1b0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
e1c0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
e1d0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
e1e0: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
e1f0: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
e200: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
e210: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
e220: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
e230: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
e240: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
e250: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
e260: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
e270: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
e280: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
e290: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
e2a0: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
e2b0: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
e2c0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
e2d0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e2e0: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
e2f0: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
e300: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
e310: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
e320: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
e330: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
e340: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
e350: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
e360: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
e370: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
e380: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
e390: 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  nc || (pPager->j
e3a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
e3b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
e3c0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
e3d0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
e3e0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
e3f0: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
e400: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
e410: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
e420: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
e430: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
e440: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e450: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
e460: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e470: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
e480: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
e490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
e4a0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
e4b0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e4c0: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
e4d0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
e4e0: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
e4f0: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
e500: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
e510: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
e520: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
e530: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
e540: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e550: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e560: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
e570: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e580: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
e590: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
e5a0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e5b0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e5c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
e5d0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
e5e0: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
e5f0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
e600: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
e610: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
e620: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e630: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e640: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
e650: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
e660: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
e670: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
e680: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e690: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
e6a0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
e6b0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
e6c0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
e6d0: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
e6e0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
e6f0: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
e700: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
e710: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e720: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
e730: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
e740: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
e750: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
e760: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
e770: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
e780: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
e790: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
e7a0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
e7b0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
e7c0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e7d0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
e7e0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
e7f0: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
e800: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
e810: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
e820: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
e830: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
e840: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
e850: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
e860: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
e870: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
e880: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
e890: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
e8a0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
e8b0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
e8c0: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
e8d0: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
e8e0: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
e8f0: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
e900: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
e910: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
e920: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
e930: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
e940: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
e950: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
e960: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
e970: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
e980: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
e990: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
e9a0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
e9b0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
e9c0: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
e9d0: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
e9e0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
e9f0: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
ea00: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
ea10: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
ea20: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
ea30: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
ea40: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
ea50: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
ea60: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
ea70: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
ea80: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
ea90: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
eaa0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
eab0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
eac0: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
ead0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
eae0: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
eaf0: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
eb00: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
eb10: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
eb20: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
eb30: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
eb40: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
eb50: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
eb60: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
eb70: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
eb80: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
eb90: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
eba0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
ebb0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
ebc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
ebd0: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
ebe0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
ebf0: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
ec00: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
ec10: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
ec20: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
ec30: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
ec40: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
ec50: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
ec60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
ec70: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
ec80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ec90: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
eca0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ecb0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
ecc0: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
ecd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ece0: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
ecf0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
ed00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
ed10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
ed20: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
ed30: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
ed40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
ed50: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
ed60: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
ed70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
ed80: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
ed90: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
eda0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
edb0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
edc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
edd0: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
ede0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
edf0: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
ee00: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
ee10: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
ee20: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
ee30: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
ee40: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
ee50: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
ee60: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
ee70: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
ee80: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
ee90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
eea0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
eeb0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
eec0: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
eed0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
eee0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
eef0: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
ef00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
ef10: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
ef20: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
ef30: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
ef40: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
ef50: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
ef60: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
ef70: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
ef80: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
ef90: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
efa0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
efb0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
efc0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
efd0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
efe0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
eff0: 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
f000: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
f010: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
f020: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
f030: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
f040: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f050: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
f060: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
f070: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
f080: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
f090: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
f0a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
f0b0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
f0c0: 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
f0d0: 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
f0e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f0f0: 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
f100: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
f110: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
f120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f130: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f140: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
f150: 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
f160: 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
f170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f180: 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
f190: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
f1a0: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
f1b0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f1d0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
f1e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
f1f0: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
f200: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
f210: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
f220: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
f230: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
f240: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
f250: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
f260: 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
f270: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
f280: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
f290: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
f2a0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
f2b0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
f2c0: 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
f2d0: 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
f2e0: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
f2f0: 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
f300: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
f310: 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
f320: 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
f330: 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
f340: 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
f350: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
f360: 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
f370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f380: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
f390: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
f3a0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
f3b0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
f3c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
f3d0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
f3e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f3f0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
f400: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
f410: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
f420: 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
f430: 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
f440: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
f450: 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
f460: 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
f470: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
f480: 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
f490: 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
f4a0: 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
f4b0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
f4c0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
f4d0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
f4e0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
f4f0: 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
f500: 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
f510: 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
f520: 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
f530: 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
f540: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
f550: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
f560: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
f570: 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
f580: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f590: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f5a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
f5b0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
f5c0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
f5d0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
f5e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f5f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
f600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
f610: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
f620: 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
f630: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f640: 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
f650: 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
f660: 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
f670: 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
f680: 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
f690: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
f6a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
f6b0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f6c0: 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
f6d0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
f6e0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
f6f0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
f700: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
f710: 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
f720: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
f730: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f740: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f750: 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
f760: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
f770: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
f780: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f790: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f7a0: 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
f7b0: 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
f7c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
f7d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
f7e0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
f7f0: 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
f800: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
f810: 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
f820: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
f830: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
f840: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
f850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
f860: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
f870: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
f880: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
f890: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
f8a0: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
f8b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f8c0: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
f8d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f8e0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f8f0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f900: 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
f910: 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
f920: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
f930: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
f940: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
f950: 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
f960: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
f970: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
f980: 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66    /* Versions of
f990: 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
f9a0: 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70   3.5.8 set the p
f9b0: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
f9c0: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  f the.    ** jou
f9d0: 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a  rnal header to z
f9e0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
f9f0: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
fa00: 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  he Pager.pageSiz
fa10: 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  e.    ** variabl
fa20: 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  e is already set
fa30: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
fa40: 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  page size..    *
fa50: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fa60: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
fa70: 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  iPageSize = pPag
fa80: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
fa90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
faa0: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
fab0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
fac0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fad0: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
fae0: 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
faf0: 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
fb00: 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
fb10: 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
fb20: 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
fb30: 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
fb40: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
fb50: 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
fb60: 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
fb70: 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
fb80: 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
fb90: 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
fba0: 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
fbb0: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
fbc0: 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
fbd0: 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
fbe0: 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
fbf0: 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
fc00: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
fc10: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
fc20: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
fc30: 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
fc40: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
fc50: 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
fc60: 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
fc70: 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
fc80: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
fc90: 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
fca0: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
fcb0: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
fcc0: 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
fcd0: 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
fce0: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
fcf0: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
fd00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
fd10: 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
fd20: 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
fd30: 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
fd40: 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
fd50: 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
fd60: 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
fd70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
fd80: 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
fd90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fda0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
fdb0: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
fdc0: 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
fdd0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
fde0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
fdf0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
fe00: 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
fe10: 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
fe20: 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
fe30: 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
fe40: 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
fe50: 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
fe60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
fe70: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
fe80: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
fe90: 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
fea0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
feb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fec0: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
fed0: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
fee0: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
fef0: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
ff00: 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
ff10: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
ff20: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
ff30: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
ff40: 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
ff50: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
ff60: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
ff70: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
ff80: 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
ff90: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
ffa0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
ffb0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
ffc0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
ffd0: 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
ffe0: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
fff0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
10000 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
10010 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
10020 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
10030 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
10040 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
10050 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
10060 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10070 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
10080 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
10090 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
100a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
100b0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
100c0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
100d0 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
100e0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
100f0 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
10100 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
10110 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
10120 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
10130 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
10140 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
10150 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
10160 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
10170 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
10180 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
10190 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
101a0 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
101b0 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
101c0 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
101d0 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
101e0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
101f0 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
10200 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
10210 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
10220 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
10230 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
10240 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
10250 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
10260 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
10270 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
10280 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
10290 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
102a0 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
102b0 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
102c0 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
102d0 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
102e0 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
102f0 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
10300 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
10310 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
10320 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
10330 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
10340 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
10350 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
10360 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
10370 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
10380 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
10390 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
103a0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
103b0 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
103c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
103d0 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
103e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
103f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
10400 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
10410 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10440 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
10450 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
10460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
10470 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
10480 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
10490 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
104b0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
104c0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
104d0 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
104e0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
104f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10500 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
10510 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
10520 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10540 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
10550 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
10560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10570 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
10580 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
10590 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
105a0 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
105b0 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
105c0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
105d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
105e0 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70  _MEMORY .   || p
105f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10600 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10610 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a  LMODE_OFF .  ){.
10620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10630 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10640 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10650 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  1;.  assert( isO
10660 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
10670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10680 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10690 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
106a0 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20  nalOff );..  /* 
106b0 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65  Calculate the le
106c0 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e  ngth in bytes an
106d0 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  d the checksum o
106e0 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66  f zMaster */.  f
106f0 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d  or(nMaster=0; zM
10700 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20  aster[nMaster]; 
10710 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20  nMaster++){.    
10720 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
10730 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a  [nMaster];.  }..
10740 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
10750 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
10760 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
10770 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
10780 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
10790 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
107a0 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
107b0 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
107c0 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
107d0 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
107e0 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
107f0 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
10800 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
10810 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
10820 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10830 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
10840 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
10850 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
10860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10870 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  Off;..  /* Write
10880 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10890 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20  nal data to the 
108a0 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
108b0 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a  al file. If.  **
108c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
108d0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
108e0 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
108f0 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  aller..  */.  if
10900 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  ( (0 != (rc = wr
10910 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
10920 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20  ->jfd, iHdrOff, 
10930 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
10940 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28  ager)))).   || (
10950 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
10960 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
10970 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
10980 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66  nMaster, iHdrOff
10990 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  +4))).   || (0 !
109a0 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
109b0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
109c0 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
109d0 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20  er, nMaster))). 
109e0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
109f0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10a00 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10a10 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63  f+4+nMaster+4, c
10a20 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30  ksum))).   || (0
10a30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10a40 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10a50 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
10a60 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b  gic, 8, iHdrOff+
10a70 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
10a80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10a90 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
10aa0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
10ab0 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
10ac0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
10ad0 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
10ae0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
10af0 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
10b00 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
10b10 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
10b20 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
10b30 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10b40 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
10b50 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
10b60 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
10b70 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
10b80 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
10b90 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
10ba0 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
10bb0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
10bc0 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
10bd0 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
10be0 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
10bf0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
10c00 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
10c10 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
10c20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
10c30 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
10c40 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
10c50 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
10c60 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
10c70 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
10c80 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
10c90 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
10ca0 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
10cb0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
10cc0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
10cd0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
10ce0 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
10cf0 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
10d00 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
10d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10d20 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
10d30 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
10d40 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
10d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10d60 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
10d70 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
10d80 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
10d90 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e  e number. Return
10da0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
10db0 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
10dc0 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  L if the request
10dd0 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a  ed page is not .
10de0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
10df0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
10e00 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
10e10 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
10e20 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
10e30 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
10e60 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  ue */..  /* It i
10e70 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
10e80 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61  or a call to Pca
10e90 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20  cheFetch() with 
10ea0 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f  createFlag==0 to
10eb0 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63  .  ** fail, sinc
10ec0 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e no attempt to 
10ed0 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63  allocate dynamic
10ee0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
10ef0 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f  made..  */.  (vo
10f00 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65  id)sqlite3Pcache
10f10 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
10f20 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
10f30 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
10f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
10f50 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
10f60 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
10f70 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
10f80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
10f90 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
10fa0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10fb0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
10fc0 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
10fd0 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ckup);.  sqlite3
10fe0 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
10ff0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
11000 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11010 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11020 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
11030 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
11040 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
11050 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
11060 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
11070 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
11080 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
11090 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
110a0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
110b0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
110c0 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
110d0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
110e0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
110f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11100 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11110 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11120 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
11130 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
11140 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11150 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
11160 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
11170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
11180 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11190 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
111a0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
111b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
111c0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
111d0 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d  de || sqlite3IsM
111e0 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
111f0 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
11200 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
11210 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
11220 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11230 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11240 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
11250 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
11260 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
11270 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
11280 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
11290 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
112a0 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
112b0 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
112c0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
112d0 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
112e0 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
112f0 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
11300 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11310 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
11320 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
11330 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
11340 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
11350 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
11360 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
11370 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
11380 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
113b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
113c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
113d0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
113e0 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
113f0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
11400 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
11410 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
11420 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
11430 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
11440 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
11450 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
11460 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
11470 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
11480 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
11490 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
114a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
114b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
114c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
114d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
114e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
114f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11500 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11510 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
11520 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11530 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
11540 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
11550 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
11560 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
11570 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
11580 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
11590 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
115a0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
115b0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
115c0 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
115d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
115e0 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
115f0 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
11600 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
11610 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
11620 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
11630 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
11640 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11650 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
11660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
11670 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
11680 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
11690 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
116a0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
116b0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
116c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
116d0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
116e0 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
116f0 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
11700 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
11710 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
11720 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
11730 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
11740 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
11750 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
11760 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
11770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
11780 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
11790 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
117a0 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
117b0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
117c0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
117d0 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
117e0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
117f0 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
11800 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
11810 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
11820 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11830 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
11840 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
11850 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11860 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
11870 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
11880 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11890 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
118a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
118b0 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
118c0 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42    );..  sqlite3B
118d0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
118e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
118f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
11900 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
11910 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
11920 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
11930 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
11940 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
11950 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
11960 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
11970 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
11980 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
11990 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
119a0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
119b0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
119c0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
119d0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
119e0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11a10 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
11a20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
11a30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
11a40 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
11a50 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
11a60 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11a70 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
11a80 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
11a90 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
11aa0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
11ab0 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
11ac0 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
11ad0 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
11ae0 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
11af0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
11b00 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
11b10 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
11b20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
11b30 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
11b40 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
11b50 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
11b60 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
11b70 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
11b80 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11b90 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
11ba0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
11bb0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11bc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
11bd0 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
11be0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11bf0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11c00 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
11c10 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11c20 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11c30 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
11c40 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11c50 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11c60 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
11c70 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
11c80 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11c90 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
11ca0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
11cb0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
11cc0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
11cd0 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
11ce0 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
11cf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
11d00 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
11d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
11d20 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
11d30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11d40 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11d50 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11d60 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
11d70 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
11d80 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
11d90 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
11da0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
11db0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
11dc0 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
11dd0 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
11de0 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
11df0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
11e00 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
11e10 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
11e20 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
11e30 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
11e40 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
11e50 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
11e60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11e70 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
11e80 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
11e90 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
11ea0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
11eb0 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
11ec0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
11ed0 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
11ee0 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
11ef0 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
11f00 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
11f10 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
11f20 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
11f30 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
11f40 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
11f50 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
11f60 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
11f70 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
11f80 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
11f90 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
11fa0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
11fb0 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
11fc0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
11fd0 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
11fe0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
11ff0 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12000 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12010 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12020 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12030 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12040 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12050 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
12060 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
12070 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
12080 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12090 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
120a0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
120b0 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
120c0 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
120d0 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
120e0 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
120f0 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12100 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12110 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12120 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12130 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12140 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
12150 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
12160 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
12170 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12180 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
12190 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
121a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
121b0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
121c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
121d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
121e0 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
121f0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
12200 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12210 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
12220 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
12230 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
12240 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12250 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45   whenever an IOE
12260 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72  RR or FULL error
12270 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a   that requires.*
12280 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74  * the pager to t
12290 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74  ransition into t
122a0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d  he ERROR state m
122b0 61 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64  ay ahve occurred
122c0 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  ..** The first a
122d0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
122e0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
122f0 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
12300 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20   second .** the 
12310 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
12320 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
12330 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
12340 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a  unction. The .**
12350 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
12360 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
12370 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12380 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
12390 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
123a0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
123b0 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c   is SQLITE_FULL,
123c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
123d0 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49   one of the.** I
123e0 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20  OERR sub-codes, 
123f0 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
12400 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12410 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
12420 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ode.** is stored
12430 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64   in Pager.errCod
12440 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  e. While the pag
12450 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68  er remains in th
12460 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a  e ERROR state,.*
12470 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20  * all major API 
12480 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67  calls on the Pag
12490 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
124a0 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72  ely return Pager
124b0 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  .errCode..**.** 
124c0 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  The ERROR state 
124d0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
124e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
124f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
12500 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
12510 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
12520 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
12530 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
12540 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
12550 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12560 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
12570 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
12580 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
12590 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
125a0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
125b0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
125c0 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
125d0 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
125e0 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
125f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12610 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
12620 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
12630 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
12640 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
12650 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
12660 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
12670 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
12680 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
12690 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
126a0 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  );.  assert(.   
126b0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
126c0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
126d0 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
126e0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
126f0 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
12700 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
12710 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
12720 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
12730 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55  ( rc2==SQLITE_FU
12740 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54  LL || rc2==SQLIT
12750 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70  E_IOERR ){.    p
12760 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12770 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
12780 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12790 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
127a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
127b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
127c0 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
127d0 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
127e0 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
127f0 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
12800 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
12810 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
12820 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
12830 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
12840 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
12850 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
12860 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
12870 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
12880 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
12890 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
128a0 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
128b0 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
128c0 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
128d0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
128e0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
128f0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
12900 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
12910 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
12920 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
12930 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
12940 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
12950 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
12960 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
12970 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
12980 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
12990 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
129a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
129b0 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
129c0 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
129d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
129e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
129f0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
12a00 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
12a10 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
12a20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
12a30 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
12a40 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
12a50 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
12a60 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
12a70 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
12a80 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
12a90 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
12aa0 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
12ab0 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
12ac0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
12ad0 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
12ae0 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
12af0 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
12b00 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
12b10 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
12b20 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
12b30 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
12b40 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
12b50 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
12b60 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
12b70 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
12b80 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12b90 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
12ba0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
12bb0 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
12bc0 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
12bd0 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
12be0 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
12bf0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
12c00 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
12c10 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
12c20 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
12c30 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
12c40 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
12c50 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12c60 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
12c70 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
12c80 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
12c90 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
12ca0 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
12cb0 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
12cc0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
12cd0 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
12ce0 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
12cf0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
12d00 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
12d10 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
12d20 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
12d30 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
12d40 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12d50 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
12d60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
12d70 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
12d80 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
12d90 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
12da0 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
12db0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
12dc0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12dd0 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
12de0 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
12df0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
12e00 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
12e10 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
12e20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
12e30 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
12e40 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
12e50 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
12e60 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
12e70 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
12e80 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
12e90 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
12ea0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
12eb0 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
12ec0 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12ed0 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
12ee0 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
12ef0 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
12f00 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
12f10 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
12f20 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
12f30 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
12f40 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
12f50 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
12f60 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
12f70 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
12f80 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
12f90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12fa0 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
12fb0 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
12fc0 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
12fd0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
12fe0 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
12ff0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
13000 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
13010 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13020 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
13030 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
13040 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
13050 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13060 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
13070 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
13080 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
13090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
130a0 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
130b0 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
130c0 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
130d0 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
130e0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
130f0 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
13100 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
13110 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
13120 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
13130 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
13140 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
13150 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
13160 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
13170 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
13180 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
13190 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
131a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
131b0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
131c0 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
131d0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
131e0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
131f0 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
13200 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
13210 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
13220 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
13230 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
13240 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
13250 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
13260 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
13270 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
13280 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
13290 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
132a0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
132b0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
132c0 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
132d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
132e0 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
132f0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
13300 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
13310 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
13320 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
13330 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
13340 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
13350 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
13360 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
13370 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
13380 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
13390 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
133a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
133b0 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
133c0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
133d0 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
133e0 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
133f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
13400 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
13410 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
13420 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
13430 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
13440 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
13450 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13460 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
13470 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
13480 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
13490 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
134a0 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
134b0 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
134c0 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
134d0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
134e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
134f0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
13500 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
13510 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
13520 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
13530 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
13540 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
13550 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
13560 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
13570 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
13580 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13590 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
135a0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
135b0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
135c0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
135d0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
135e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
135f0 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
13600 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
13610 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
13620 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
13630 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
13640 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13650 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
13660 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d  if( sqlite3IsMem
13670 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
13680 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
13690 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
136a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
136b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
136c0 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ORY );.      sql
136d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
136e0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
136f0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13700 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13710 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
13720 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
13730 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13740 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
13750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13760 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
13770 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13780 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
13790 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
137a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
137b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
137c0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
137d0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
137e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
137f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
13800 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
13810 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
13820 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
13830 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
13840 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13850 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
13860 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
13870 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
13880 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
13890 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
138a0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
138b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
138c0 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
138d0 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
138e0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
138f0 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
13900 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
13910 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
13920 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
13930 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
13940 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
13950 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
13960 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
13970 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
13980 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
13990 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
139a0 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
139b0 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
139c0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a  emory journal. .
139d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
139e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
139f0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13a00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
13a10 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20  LETE .          
13a20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
13a30 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13a40 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
13a50 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y .           ||
13a60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13a70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13a80 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
13a90 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
13aa0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13ab0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
13ac0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
13ad0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
13ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
13af0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
13b00 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
13b10 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
13b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
13b30 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
13b40 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50  PAGES.  sqlite3P
13b50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
13b60 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
13b70 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
13b80 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50  ehash);.  if( pP
13b90 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20  ager->dbSize==0 
13ba0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
13bb0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
13bc0 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
13bd0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61     PgHdr *p = pa
13be0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
13bf0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
13c00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67   ){.      p->pag
13c10 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  eHash = 0;.     
13c20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
13c30 65 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ef(p);.    }.  }
13c40 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
13c50 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
13c60 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
13c70 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
13c80 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
13c90 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
13ca0 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  0;.  sqlite3Pcac
13cb0 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
13cc0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73  r->pPCache);.  s
13cd0 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
13ce0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
13cf0 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62  ache, pPager->db
13d00 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61  Size);..  if( pa
13d10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13d20 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70  ) ){.    /* Drop
13d30 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c   the WAL write-l
13d40 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73  ock, if any. Als
13d50 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  o, if the connec
13d60 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20  tion was in .   
13d70 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   ** locking_mode
13d80 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
13d90 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
13da0 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  , drop the EXCLU
13db0 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  SIVE .    ** loc
13dc0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  k held on the da
13dd0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
13de0 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71   */.    rc2 = sq
13df0 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65  lite3WalEndWrite
13e00 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
13e10 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61  er->pWal);.    a
13e20 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49  ssert( rc2==SQLI
13e30 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
13e40 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
13e50 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26  usiveMode .   &&
13e60 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70   (!pagerUseWal(p
13e70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65  Pager) || sqlite
13e80 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
13e90 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
13ea0 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32  0)).  ){.    rc2
13eb0 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
13ec0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
13ed0 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
13ee0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
13ef0 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ne = 0;.  }.  pP
13f00 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
13f10 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70  AGER_READER;.  p
13f20 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
13f30 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
13f40 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
13f50 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
13f60 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
13f70 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
13f80 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
13f90 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
13fa0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
13fb0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
13fc0 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
13fd0 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
13fe0 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  OR state, do not
13ff0 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65   attempt .** the
14000 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69   rollback at thi
14010 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c  s time. Instead,
14020 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
14030 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a  is called. The.*
14040 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
14050 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69  unlock() will di
14060 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
14070 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63  ory pages, unloc
14080 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  k.** the databas
14090 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20  e file and move 
140a0 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
140b0 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66  o OPEN state. If
140c0 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20   this .** means 
140d0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
140e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  hot-journal left
140f0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
14100 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a  tem, the next .*
14110 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * connection to 
14120 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
14130 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
14140 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  r (which may be 
14150 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69  this one) .** wi
14160 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ll roll it back.
14170 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14180 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
14190 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
141a0 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74  ERROR state, but
141b0 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
141c0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
141d0 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
141e0 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
141f0 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
14200 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
14210 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
14220 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
14230 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
14240 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
14250 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
14260 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
14270 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
14280 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
14290 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
142a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
142b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
142c0 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
142d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
142e0 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
142f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
14300 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
14310 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  er) );.    if( p
14320 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
14330 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
14340 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ED ){.      sqli
14350 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
14360 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71  lloc();.      sq
14370 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
14380 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14390 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
143a0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
143b0 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
143c0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
143d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
143e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
143f0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
14400 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e  ;.      pager_en
14410 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
14420 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
14430 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
14440 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
14450 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
14460 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
14470 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
14480 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
14490 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
144a0 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
144b0 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
144c0 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
144d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
144e0 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
144f0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
14500 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
14510 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
14520 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
14530 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
14540 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
14550 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
14560 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
14570 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
14580 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
14590 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
145a0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
145b0 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
145c0 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
145d0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
145e0 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
145f0 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
14600 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
14610 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
14620 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
14630 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
14640 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
14650 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
14660 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
14670 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
14680 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
14690 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
146a0 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
146b0 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
146c0 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
146d0 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
146e0 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
146f0 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
14700 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
14710 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
14720 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
14730 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
14740 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
14750 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
14760 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
14770 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
14780 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
14790 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
147a0 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
147b0 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
147c0 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
147d0 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
147e0 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
147f0 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
14800 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
14810 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
14820 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
14830 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
14840 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
14850 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
14860 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
14870 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
14880 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
14890 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
148a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
148b0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
148c0 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
148d0 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
148e0 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
148f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
14900 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  m;.}../*.** Repo
14910 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
14920 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
14930 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
14940 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
14950 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
14960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
14970 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
14980 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
14990 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
149a0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
149b0 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
149c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
149d0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
149e0 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
149f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
14a20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
14a30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
14a40 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
14a50 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
14a60 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
14a70 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
14a80 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
14a90 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
14aa0 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
14ab0 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
14ac0 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
14ad0 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
14ae0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
14af0 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
14b00 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
14b10 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
14b20 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
14b30 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
14b40 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
14b50 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
14b60 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
14b70 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
14b80 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
14b90 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
14ba0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  nal..**.** The m
14bb0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
14bc0 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73  rnal uses checks
14bd0 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
14be0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
14bf0 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   .** not..**.** 
14c00 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
14c10 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
14c20 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
14c30 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
14c40 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
14c50 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
14c60 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
14c70 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
14c80 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
14c90 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
14ca0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
14cb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
14cc0 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
14cd0 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
14ce0 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
14cf0 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
14d00 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
14d10 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
14d20 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
14d30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
14d40 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
14d50 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
14d60 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
14d70 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
14d80 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
14d90 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
14da0 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
14db0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
14dc0 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
14dd0 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
14de0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
14df0 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
14e00 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
14e10 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
14e20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
14e30 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
14e40 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
14e50 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14e60 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
14e70 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
14e80 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
14e90 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
14ea0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
14eb0 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
14ec0 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
14ed0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
14ee0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
14ef0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
14f00 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
14f10 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
14f20 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
14f30 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
14f40 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
14f50 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
14f60 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
14f70 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
14f80 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
14f90 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
14fa0 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
14fb0 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
14fc0 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
14fd0 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
14fe0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
14ff0 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
15000 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
15010 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
15020 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
15030 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
15040 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
15050 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
15060 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
15070 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
15080 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
15090 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
150a0 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
150b0 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
150c0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
150d0 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
150e0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
150f0 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
15100 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
15110 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
15120 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
15130 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
15140 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
15150 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
15160 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
15170 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
15180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15190 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
151a0 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
151b0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
151c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
151d0 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
151e0 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
151f0 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
15200 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
15210 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
15220 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
15230 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
15240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
15250 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
15260 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
15270 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
15280 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
15290 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
152a0 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
152b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
152c0 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
152f0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15300 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
15310 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15330 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
15340 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
15350 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
15360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15370 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
15380 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
15390 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
153a0 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
153d0 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
153e0 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
153f0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
15400 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
15410 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
15420 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
15430 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
15440 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15450 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
15460 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
15470 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
15480 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
15490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
154a0 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
154b0 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
154c0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
154d0 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
154e0 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
154f0 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
15500 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
15510 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
15520 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
15530 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
15540 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
15550 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
15560 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
15570 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
15580 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
15590 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
155a0 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
155b0 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
155c0 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
155d0 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
155e0 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
155f0 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
15600 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
15610 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
15620 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
15630 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
15640 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
15650 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
15660 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
15670 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
15680 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
15690 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65  Either the state
156a0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
156b0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
156c0 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61  CHEMOD (a transa
156d0 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73  ction .  ** or s
156e0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
156f0 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65  k done at the re
15700 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c  quest of the cal
15710 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a  ler) or this is.
15720 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
15730 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20  al rollback. If 
15740 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  it is a hot-jour
15750 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  nal rollback, th
15760 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20  e pager.  ** is 
15770 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e  in state OPEN an
15780 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55  d holds an EXCLU
15790 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a  SIVE lock. Hot-j
157a0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
157b0 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20    ** only reads 
157c0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
157d0 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73  urnal, not the s
157e0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ub-journal..  */
157f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15800 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
15810 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15820 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
15830 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
15840 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
15850 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
15860 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20  VE_LOCK).  );.  
15870 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15880 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
15890 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c  ITER_CACHEMOD ||
158a0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a   isMainJrnl );..
158b0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
158c0 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
158d0 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
158e0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
158f0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
15900 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
15910 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
15920 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
15930 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
15940 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
15950 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
15960 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
15970 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
15980 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
15990 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
159a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
159b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
159c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
159d0 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
159e0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
159f0 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
15a00 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
15a10 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
15a20 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
15a30 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
15a40 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
15a50 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
15a60 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
15a70 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
15a80 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
15a90 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
15aa0 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
15ab0 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
15ac0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
15ad0 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
15ae0 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
15af0 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
15b00 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
15b10 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
15b20 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
15b30 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
15b40 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
15b50 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
15b60 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
15b70 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
15b80 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
15b90 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
15ba0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
15bb0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
15bc0 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
15bd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15be0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
15bf0 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
15c00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
15c10 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
15c20 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
15c30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15c40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
15c50 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
15c60 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
15c70 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
15c80 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
15c90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
15ca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
15cb0 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
15cc0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
15cd0 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
15ce0 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
15cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
15d00 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
15d10 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
15d20 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
15d30 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f  n played by befo
15d40 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  re during the cu
15d50 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62  rrent.  ** rollb
15d60 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20  ack, then don't 
15d70 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69  bother to play i
15d80 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20  t back again..  
15d90 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  */.  if( pDone &
15da0 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
15db0 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
15dc0 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
15dd0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
15de0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  rc;.  }..  /* Wh
15df0 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  en playing back 
15e00 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20  page 1, restore 
15e10 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74  the nReserve set
15e20 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ting.  */.  if( 
15e30 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65  pgno==1 && pPage
15e40 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75  r->nReserve!=((u
15e50 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b  8*)aData)[20] ){
15e60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
15e70 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44  serve = ((u8*)aD
15e80 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61  ata)[20];.    pa
15e90 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
15ea0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
15eb0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
15ec0 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61   in CACHEMOD sta
15ed0 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
15ee0 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
15ef0 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
15f00 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
15f10 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
15f20 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
15f30 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
15f40 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
15f50 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
15f60 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
15f70 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
15f80 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
15f90 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
15fa0 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
15fb0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
15fc0 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
15fd0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
15fe0 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
15ff0 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
16000 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
16010 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
16020 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
16030 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
16040 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
16050 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
16060 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
16070 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
16080 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
16090 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
160a0 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
160b0 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
160c0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
160d0 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
160e0 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
160f0 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
16100 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
16110 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57   WRITER_DBMOD, W
16120 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f  RITER_FINISHED o
16130 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
16140 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
16150 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68  .  ** pager cach
16160 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61  e if it exists a
16170 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
16180 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
16190 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20  en marked .  ** 
161a0 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65  not dirty. Since
161b0 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e   this code is on
161c0 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50  ly executed in P
161d0 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
161e0 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a  for.  ** a hot-j
161f0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
16200 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
16210 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
16220 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20  cache is empty. 
16230 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72   ** if the pager
16240 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74   is in OPEN stat
16250 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  e..  **.  ** Tic
16260 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
16270 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
16280 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
16290 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
162a0 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
162b0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
162c0 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
162d0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
162e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
162f0 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
16300 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
16310 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
16320 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
16330 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
16340 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
16350 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
16360 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
16370 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
16380 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
16390 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
163a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
163b0 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
163c0 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
163d0 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
163e0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
163f0 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
16400 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
16410 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
16420 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
16430 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
16440 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
16450 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
16460 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
16470 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
16480 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
16490 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
164a0 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
164b0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
164c0 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
164d0 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
164e0 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
164f0 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
16500 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
16510 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
16520 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
16530 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
16540 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
16550 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
16560 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
16570 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
16580 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
16590 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
165a0 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
165b0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
165c0 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
165d0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
165e0 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
165f0 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
16600 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
16610 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
16620 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
16630 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
16640 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
16650 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
16660 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
16670 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
16680 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
16690 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
166a0 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
166b0 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
166c0 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
166d0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
166e0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
166f0 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
16700 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
16710 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
16720 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73   pgno);.  }.  as
16730 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
16740 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
16750 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
16760 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
16770 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  Pg==0 );.  PAGER
16780 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
16790 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
167a0 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
167b0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
167c0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
167d0 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
167e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
167f0 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20   (u8*)aData),.  
16800 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
16810 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
16820 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
16830 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69  ").  ));.  if( i
16840 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
16850 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67   isSynced = pPag
16860 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a  er->noSync || (*
16870 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65  pOffset <= pPage
16880 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
16890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53    }else{.    isS
168a0 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20  ynced = (pPg==0 
168b0 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
168c0 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
168d0 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  YNC));.  }.  if(
168e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
168f0 66 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65  fd).   && (pPage
16900 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
16910 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
16920 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
16930 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20  =PAGER_OPEN).   
16940 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
16950 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
16960 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
16970 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
16980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
16990 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
169a0 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
169b0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
169c0 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
169d0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
169e0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
169f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
16a00 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
16a10 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
16a20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
16a30 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
16a40 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
16a50 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
16a60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
16a70 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
16a80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16a90 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
16aa0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
16ab0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
16ac0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
16ad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
16ae0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
16af0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
16b00 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
16b10 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
16b20 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
16b30 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
16b40 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
16b50 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16b60 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
16b70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
16b80 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
16b90 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
16ba0 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
16bb0 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
16bc0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
16bd0 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
16be0 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
16bf0 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
16c00 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
16c10 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
16c20 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
16c30 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
16c40 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
16c50 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
16c60 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
16c70 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
16c80 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
16c90 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
16ca0 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
16cb0 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
16cc0 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
16cd0 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
16ce0 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
16cf0 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
16d00 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
16d10 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
16d20 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
16d30 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
16d40 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
16d50 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
16d60 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
16d70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
16d80 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
16d90 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
16da0 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
16db0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
16dc0 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
16dd0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
16de0 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
16df0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
16e00 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
16e10 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
16e20 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
16e30 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
16e40 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
16e50 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
16e60 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
16e70 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
16e80 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
16e90 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
16ea0 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
16eb0 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
16ec0 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
16ed0 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
16ee0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
16ef0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
16f00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16f10 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29  >doNotSpill==0 )
16f20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
16f30 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20  NotSpill++;.    
16f40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16f50 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
16f60 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
16f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16f80 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d  ger->doNotSpill=
16f90 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
16fa0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a  ->doNotSpill--;.
16fb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16fc0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
16fd0 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
16fe0 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
16ff0 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
17000 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
17010 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
17020 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
17030 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
17040 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
17050 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
17060 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
17070 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
17080 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
17090 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
170a0 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
170b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
170c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
170d0 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
170e0 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
170f0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
17100 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
17110 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
17120 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
17130 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
17140 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
17150 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
17160 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
17170 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
17180 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
17190 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
171a0 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
171b0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
171c0 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
171d0 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
171e0 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
171f0 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
17200 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
17210 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
17220 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
17230 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
17240 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
17250 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
17260 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
17270 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
17280 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
17290 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
172a0 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
172b0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
172c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
172d0 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
172e0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
172f0 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
17300 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
17310 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
17320 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
17330 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
17340 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
17350 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
17360 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
17370 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
17380 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
17390 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
173a0 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
173b0 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
173c0 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
173d0 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
173e0 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
173f0 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
17400 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
17410 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
17420 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
17430 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
17440 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
17450 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
17460 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
17470 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
17480 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
17490 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
174a0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
174b0 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
174c0 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
174d0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
174e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
174f0 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
17500 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
17510 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
17520 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
17530 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
17540 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
17550 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
17560 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
17570 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
17580 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
17590 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
175a0 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
175b0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
175c0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
175d0 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
175e0 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
175f0 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
17600 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
17610 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
17620 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
17630 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
17640 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
17650 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
17660 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
17670 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
17680 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
17690 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
176a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
176b0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
176c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
176d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
176e0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
176f0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
17700 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
17710 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
17720 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
17730 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
17740 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
17750 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
17760 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
17770 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
17780 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
17790 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
177a0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
177b0 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
177c0 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
177d0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
177e0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
177f0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
17800 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
17810 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
17820 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
17830 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
17840 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
17850 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
17860 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
17870 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
17880 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17890 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
178a0 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
178b0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
178c0 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
178d0 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
178e0 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
178f0 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
17900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
17910 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
17920 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
17930 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
17940 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
17950 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
17960 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17970 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
17980 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
17990 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
179a0 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
179b0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
179c0 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
179d0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
179e0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
179f0 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
17a00 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
17a10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17a20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
17a30 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
17a40 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
17a50 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
17a60 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
17a70 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
17a80 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
17a90 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
17aa0 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
17ab0 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
17ac0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
17ad0 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
17ae0 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
17af0 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
17b00 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
17b10 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
17b20 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
17b30 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
17b40 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
17b50 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
17b60 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
17b70 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
17b80 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
17b90 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
17ba0 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
17bb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17bc0 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
17bd0 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
17be0 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
17bf0 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
17c00 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
17c10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
17c20 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
17c30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
17c40 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
17c50 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
17c60 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
17c70 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
17c80 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
17c90 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
17ca0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
17cb0 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
17cc0 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
17cd0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
17ce0 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
17cf0 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
17d00 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
17d10 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
17d20 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
17d30 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
17d40 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
17d50 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
17d60 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
17d70 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
17d80 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
17d90 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
17da0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
17db0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
17dc0 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
17dd0 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
17de0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
17df0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
17e00 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
17e10 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
17e20 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
17e30 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
17e40 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
17e50 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
17e60 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
17e70 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
17e80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
17e90 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
17ea0 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
17eb0 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
17ec0 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
17ed0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
17ee0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
17ef0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
17f00 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
17f10 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
17f20 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
17f30 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
17f40 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
17f50 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
17f60 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
17f70 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
17f80 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
17f90 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
17fa0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
17fb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
17fc0 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
17fd0 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
17fe0 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
17ff0 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
18000 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
18010 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
18020 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
18030 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
18040 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
18050 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
18060 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
18070 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
18080 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
180a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
180b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
180c0 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
180d0 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
180e0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
180f0 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
18100 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
18110 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
18120 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
18130 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
18140 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18150 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
18160 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
18170 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18180 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
18190 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
181a0 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
181b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
181c0 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
181d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
181e0 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a  Pointer to one j
181f0 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a  ournal within MJ
18200 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
18210 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20  *zMasterPtr;    
18220 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
18230 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d   hold MJ filenam
18240 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c  e from a journal
18250 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
18260 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18270 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
18280 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
18290 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b  d to zMasterPtr[
182a0 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ] */..  /* Alloc
182b0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
182c0 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
182d0 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
182e0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
182f0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
18300 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
18310 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
18320 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
18330 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
18340 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
18350 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
18360 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
18370 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
18380 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
18390 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
183a0 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
183b0 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
183c0 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
183d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
183e0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
183f0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
18400 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18410 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
18420 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
18430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18440 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
18450 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
18460 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
18470 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18480 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18490 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
184a0 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
184b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
184c0 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
184d0 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
184e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
184f0 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
18500 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
18510 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
18520 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
18530 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
18540 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
18550 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
18560 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
18570 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
18580 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
18590 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
185a0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
185b0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
185c0 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
185d0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
185e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
185f0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18600 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
18610 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
18620 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
18630 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
18640 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73  Malloc((int)nMas
18650 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
18660 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20  sterPtr + 1);.  
18670 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
18680 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
18690 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
186a0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
186b0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
186c0 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
186d0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
186e0 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
186f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
18700 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
18710 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
18720 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
18730 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18740 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18750 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
18760 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
18770 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
18780 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
18790 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
187a0 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
187b0 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
187c0 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
187d0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
187e0 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
187f0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
18800 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
18810 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
18820 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
18830 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
18850 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18870 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
18880 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
18890 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
188a0 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
188b0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
188c0 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
188d0 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
188e0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
188f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
18900 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
18910 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
18920 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
18930 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
18940 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18950 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
18960 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
18970 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
18980 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
18990 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
189a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
189b0 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
189c0 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
189d0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
189e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
189f0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
18a00 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18a10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
18a20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
18a30 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
18a40 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
18a50 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
18a60 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
18a70 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
18a80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18a90 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
18aa0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18ab0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
18ac0 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
18ad0 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
18ae0 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
18af0 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
18b00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
18b10 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
18b20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
18b30 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18b40 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
18b50 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
18b60 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
18b70 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
18b80 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
18b90 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
18ba0 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
18bb0 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
18bc0 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
18bd0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
18be0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
18bf0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
18c00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
18c10 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
18c20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
18c30 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
18c40 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
18c50 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
18c60 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
18c70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
18c80 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
18c90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
18ca0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18cb0 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
18cc0 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
18cd0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
18ce0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
18cf0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
18d00 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
18d10 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
18d20 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
18d30 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
18d40 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
18d50 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
18d60 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
18d70 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
18d80 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
18d90 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
18da0 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
18db0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
18dc0 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
18dd0 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
18de0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
18df0 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
18e00 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
18e10 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
18e20 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
18e30 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
18e40 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
18e50 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
18e60 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
18e70 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
18e80 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
18e90 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
18ea0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
18eb0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
18ec0 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
18ed0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
18ee0 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
18ef0 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
18f00 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
18f10 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
18f20 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
18f30 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
18f40 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
18f50 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
18f60 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
18f70 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
18f80 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
18f90 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
18fa0 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
18fb0 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
18fc0 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
18fd0 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
18fe0 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
18ff0 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
19000 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
19010 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
19020 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
19030 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
19040 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
19050 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
19060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
19070 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
19080 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
19090 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
190a0 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
190b0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
190c0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
190d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
190e0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
190f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
19100 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
19110 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19120 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45  eState!=PAGER_RE
19130 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28  ADER );.  .  if(
19140 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
19150 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67  fd) .   && (pPag
19160 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
19170 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
19180 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
19190 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20  ==PAGER_OPEN) . 
191a0 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
191b0 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
191c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
191d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
191e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
191f0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
19200 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
19210 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
19220 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
19230 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
19240 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
19250 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
19260 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
19270 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
19280 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
19290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
192a0 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
192b0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
192c0 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
192d0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
192e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
192f0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
19300 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
19310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19320 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19330 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
19340 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53  >fd, "", 1, newS
19350 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ize-1);.      }.
19360 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19380 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
19390 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
193a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
193b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
193c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
193d0 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
193e0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
193f0 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
19400 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
19410 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
19420 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
19430 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
19440 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
19450 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
19460 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
19470 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73   will be used us
19480 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
19490 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
194a0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
194b0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
194c0 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
194d0 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
194e0 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
194f0 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
19500 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
19510 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
19520 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
19530 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
19540 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
19550 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
19560 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
19570 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
19580 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
19590 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
195a0 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
195b0 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
195c0 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66  nded up to 32 if
195d0 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74  .** it is less t
195e0 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64  han 32, or round
195f0 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53  ed down to MAX_S
19600 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74  ECTOR_SIZE if it
19610 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
19620 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  han MAX_SECTOR_S
19630 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  IZE..*/.static v
19640 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
19650 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
19660 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  {.  assert( isOp
19670 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
19680 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
19690 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  le );..  if( !pP
196a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
196b0 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
196c0 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
196d0 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
196e0 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
196f0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
19700 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
19710 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
19720 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f  which case the O
19730 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
19740 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
19750 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a  egfault..    */.
19760 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
19770 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
19780 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
19790 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20  ger->fd);.  }.  
197a0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
197b0 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20  orSize<32 ){.   
197c0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
197d0 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20  ize = 512;.  }. 
197e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
197f0 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
19800 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61  OR_SIZE ){.    a
19810 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f  ssert( MAX_SECTO
19820 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20  R_SIZE>=512 );. 
19830 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
19840 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54  rSize = MAX_SECT
19850 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a  OR_SIZE;.  }.}..
19860 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
19870 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
19880 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
19890 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
198a0 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
198b0 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
198c0 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
198d0 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
198e0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
198f0 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
19900 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
19910 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
19920 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
19930 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
19940 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
19950 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
19960 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
19970 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
19980 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
19990 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
199a0 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
199b0 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
199c0 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
199d0 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
199e0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
199f0 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
19a00 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
19a10 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
19a20 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
19a30 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
19a40 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
19a50 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
19a60 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
19a70 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
19a80 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19a90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
19aa0 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
19ab0 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
19ac0 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
19ad0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
19ae0 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  5)  4 byte big-e
19af0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
19b00 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f  ich is the secto
19b10 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61  r size.  The hea
19b20 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20  der.**       is 
19b30 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
19b40 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29  in size..**  (6)
19b50 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
19b60 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
19b70 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69  h is the page si
19b80 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72  ze..**  (7)  zer
19b90 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f  o padding out to
19ba0 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
19bb0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20   size..**  (8)  
19bc0 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
19bd0 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
19be0 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
19bf0 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
19c00 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
19c10 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
19c20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
19c30 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
19c40 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
19c50 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
19c60 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
19c70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
19c80 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
19c90 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61   first 7 items a
19ca0 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
19cb0 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
19cc0 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
19cd0 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65  e of the 8th ite
19ce0 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
19cf0 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
19d00 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
19d10 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
19d20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
19d30 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
19d40 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
19d50 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
19d60 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
19d70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
19d80 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
19d90 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
19da0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
19db0 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
19dc0 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
19dd0 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
19de0 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
19df0 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
19e00 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
19e10 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
19e20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
19e30 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
19e40 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
19e50 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
19e60 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
19e70 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
19e80 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
19e90 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
19ea0 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
19eb0 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
19ec0 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
19ed0 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
19ee0 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
19ef0 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
19f00 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
19f10 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
19f20 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
19f30 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
19f40 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
19f50 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
19f60 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
19f70 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
19f80 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
19f90 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
19fa0 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
19fb0 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
19fc0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
19fd0 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
19fe0 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
19ff0 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
1a000 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
1a010 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
1a020 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1a030 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
1a040 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
1a050 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
1a060 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
1a070 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
1a080 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
1a090 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
1a0a0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
1a0b0 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
1a0c0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
1a0d0 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
1a0e0 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
1a0f0 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
1a100 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
1a110 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
1a120 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
1a130 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
1a140 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
1a150 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
1a160 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
1a170 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
1a180 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
1a190 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
1a1a0 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
1a1b0 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
1a1c0 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
1a1d0 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
1a1e0 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
1a1f0 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
1a200 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1a210 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
1a220 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65  e isHot paramete
1a230 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  r indicates that
1a240 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
1a250 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75  o rollback a jou
1a260 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67  rnal.** that mig
1a270 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72  ht be a hot jour
1a280 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75  nal.  Or, it cou
1a290 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a  ld be that the j
1a2a0 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72  ournal is .** pr
1a2b0 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20  eserved because 
1a2c0 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  of JOURNALMODE_P
1a2d0 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41  ERSIST or JOURNA
1a2e0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a  LMODE_TRUNCATE..
1a2f0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
1a300 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c  l really is hot,
1a310 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72   reset the pager
1a320 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c   cache prior rol
1a330 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79  ling.** back any
1a340 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68   content.  If th
1a350 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72  e journal is mer
1a360 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20  ely persistent, 
1a370 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e  no reset is.** n
1a380 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
1a390 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
1a3a0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1a3b0 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
1a3c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1a3d0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1a3e0 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a400 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
1a410 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
1a420 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
1a430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a440 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
1a450 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
1a460 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
1a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a480 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
1a490 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1a4a0 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
1a4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1a4c0 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
1a4d0 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
1a4e0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a500 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
1a510 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
1a520 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
1a530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1a540 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1a550 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1a560 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  ) */.  char *zMa
1a570 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
1a580 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
1a590 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
1a5a0 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  f any */.  int n
1a5b0 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20  eedPagerReset;  
1a5c0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
1a5d0 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20  eset page prior 
1a5e0 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f  to first page ro
1a5f0 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20  llback */..  /* 
1a600 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1a610 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
1a620 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1a630 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
1a640 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1a650 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
1a660 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1a670 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1a680 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1a690 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1a6a0 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
1a6b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a6c0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
1a6d0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1a6e0 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
1a6f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
1a700 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
1a710 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
1a720 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
1a730 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a740 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
1a750 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
1a760 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
1a770 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
1a780 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1a790 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
1a7a0 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
1a7b0 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
1a7c0 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
1a7d0 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
1a7e0 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
1a7f0 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
1a800 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
1a810 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
1a820 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
1a830 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
1a840 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
1a850 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
1a860 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
1a870 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
1a880 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1a890 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
1a8a0 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50  nix.c,.  **  mxP
1a8b0 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20  athname is 512, 
1a8c0 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d  which is the sam
1a8d0 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  e as the minimum
1a8e0 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65   allowable value
1a8f0 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69  .  ** for pageSi
1a900 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ze..  */.  zMast
1a910 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1a920 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
1a930 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1a940 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1a950 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1a960 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1a970 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
1a980 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1a990 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
1a9a0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
1a9b0 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
1a9c0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1a9d0 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
1a9e0 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
1a9f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1aa00 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
1aa10 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1aa20 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
1aa30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1aa40 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72  = 0;.  needPager
1aa50 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a  Reset = isHot;..
1aa60 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
1aa70 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
1aa80 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72   when a readJour
1aa90 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a  nalHdr() or .  *
1aaa0 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
1aab0 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c  _one_page() call
1aac0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1aad0 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
1aae0 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73  ror .  ** occurs
1aaf0 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  . .  */.  while(
1ab00 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61   1 ){.    /* Rea
1ab10 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
1ab20 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
1ab30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1ab40 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
1ab50 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
1ab60 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
1ab70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1ab80 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
1ab90 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
1aba0 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
1abb0 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
1abc0 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1abd0 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
1abe0 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
1abf0 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
1ac00 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
1ac10 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
1ac20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1ac30 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
1ac40 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a  Pager, isHot, sz
1ac50 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
1ac60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ac70 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
1ac80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ac90 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1aca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1acb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
1acc0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1acd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ace0 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
1acf0 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
1ad00 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
1ad10 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
1ad20 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
1ad30 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
1ad40 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
1ad50 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
1ad60 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
1ad70 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
1ad80 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
1ad90 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
1ada0 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
1adb0 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
1adc0 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
1add0 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
1ade0 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
1adf0 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
1ae00 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
1ae10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ae20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1ae30 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1ae40 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
1ae50 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
1ae60 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1ae70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
1ae80 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1ae90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1aea0 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
1aeb0 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
1aec0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1aed0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
1aee0 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
1aef0 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
1af00 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
1af10 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
1af20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
1af30 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
1af40 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
1af50 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
1af60 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
1af70 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
1af80 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
1af90 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
1afa0 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
1afb0 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
1afc0 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
1afd0 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
1afe0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
1aff0 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
1b000 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
1b010 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
1b020 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e  565..    ** When
1b030 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1b040 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65  hot journal, nRe
1b050 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e  c==0 always mean
1b060 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a  s that the next.
1b070 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20      ** chunk of 
1b080 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  the journal cont
1b090 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20  ains zero pages 
1b0a0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1b0b0 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77  k.  But.    ** w
1b0c0 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c  hen doing a ROLL
1b0d0 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65  BACK and the nRe
1b0e0 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68  c==0 chunk is th
1b0f0 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a  e last chunk in.
1b100 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
1b110 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  al, it means tha
1b120 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  t the journal mi
1b130 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69  ght contain addi
1b140 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61  tional.    ** pa
1b150 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ges that need to
1b160 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1b170 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d  and that the num
1b180 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20  ber of pages .  
1b190 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63    ** should be c
1b1a0 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e  omputed based on
1b1b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b1c0 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
1b1d0 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26     if( nRec==0 &
1b1e0 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20  & !isHot &&.    
1b1f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1b200 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
1b210 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
1b220 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b230 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  f ){.      nRec 
1b240 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70  = (int)((szJ - p
1b250 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b260 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
1b270 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1b280 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1b290 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1b2a0 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
1b2b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
1b2c0 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
1b2d0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1b2e0 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
1b2f0 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
1b300 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
1b310 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1b320 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b330 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
1b340 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
1b350 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
1b360 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b380 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b390 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
1b3a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1b3b0 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
1b3c0 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
1b3d0 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
1b3e0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1b3f0 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
1b400 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
1b410 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20  ase file and/or 
1b420 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20  page cache..    
1b430 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20  */.    for(u=0; 
1b440 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20  u<nRec; u++){.  
1b450 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65      if( needPage
1b460 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
1b470 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1b480 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  ager);.        n
1b490 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1b4a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1b4b0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1b4c0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
1b4d0 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f  ager,&pPager->jo
1b4e0 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b  urnalOff,0,1,0);
1b4f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b510 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b520 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1b530 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b540 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
1b550 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b560 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
1b570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b580 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1b590 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1b5a0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1b5b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
1b5c0 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
1b5d0 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c  truncated, simpl
1b5e0 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61  y stop reading a
1b5f0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
1b600 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a  processing the j
1b610 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67  ournal. This mig
1b620 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ht happen if the
1b630 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
1b640 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f         ** not co
1b650 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e  mpletely written
1b660 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f   and synced prio
1b670 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49  r to a crash.  I
1b680 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
1b690 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61   ** case, the da
1b6a0 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61  tabase should ha
1b6b0 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ve never been wr
1b6c0 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20  itten in the.   
1b6d0 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
1b6e0 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f  place so it is O
1b6f0 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e  K to simply aban
1b700 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  don the rollback
1b710 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1b720 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b730 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1b740 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1b750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b760 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
1b770 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  e unable to roll
1b780 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72  back, quit and r
1b790 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a  eturn the error.
1b7a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64            ** cod
1b7b0 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
1b7c0 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f  use the pager to
1b7d0 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
1b7e0 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20   state.         
1b7f0 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66   ** so that no f
1b800 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c  urther harm will
1b810 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61   be done.  Perha
1b820 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  ps the next.    
1b830 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1b840 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77   to come along w
1b850 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72  ill be able to r
1b860 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61  ollback the data
1b870 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  base..          
1b880 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
1b890 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1b8a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b8b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
1b8c0 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
1b8d0 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
1b8e0 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20  _playback:.  /* 
1b8f0 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c  Following a roll
1b900 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
1b910 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1b920 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72  e back in its or
1b930 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74  iginal.  ** stat
1b940 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  e prior to the s
1b950 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
1b960 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f  saction, so invo
1b970 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ke the.  ** SQLI
1b980 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1b990 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  ANGED file-contr
1b9a0 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73  ol method to dis
1b9b0 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73  able the.  ** as
1b9c0 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65  sertion that the
1b9d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1b9e0 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65  nter was modifie
1b9f0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
1ba00 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 64  (.    pPager->fd
1ba10 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c  ->pMethods==0 ||
1ba20 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
1ba30 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
1ba40 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54  ->fd,SQLITE_FCNT
1ba50 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30  L_DB_UNCHANGED,0
1ba60 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )>=SQLITE_OK.  )
1ba70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1ba80 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1ba90 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1baa0 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1bab0 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1bac0 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1bad0 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1bae0 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1baf0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1bb00 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1bb10 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1bb20 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1bb30 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1bb40 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1bb50 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1bb60 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1bb70 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1bb80 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1bb90 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1bba0 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1bbb0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1bbc0 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1bbd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1bbe0 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1bbf0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1bc00 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1bc10 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1bc20 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1bc30 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1bc40 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1bc50 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1bc60 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1bc70 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1bc80 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1bc90 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1bca0 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1bcb0 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1bcc0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1bcd0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1bce0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1bcf0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1bd00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1bd10 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1bd20 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1bd30 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1bd40 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1bd50 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1bd60 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1bd70 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1bd80 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1bd90 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1bda0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1bdb0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1bdc0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1bdd0 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1bde0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1bdf0 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1be00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1be10 72 53 79 6e 63 28 70 50 61 67 65 72 29 3b 0a 20  rSync(pPager);. 
1be20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1be30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1be40 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
1be50 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
1be60 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
1be70 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ');.    testcase
1be80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1be90 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1bea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
1beb0 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20  aster[0] && res 
1bec0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1bed0 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
1bee0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
1bef0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
1bf00 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
1bf10 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
1bf20 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
1bf30 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
1bf40 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
1bf50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
1bf60 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
1bf70 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74   zMaster);.    t
1bf80 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1bf90 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
1bfa0 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
1bfb0 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1bfc0 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
1bfd0 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
1bfe0 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
1bff0 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
1c000 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
1c010 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
1c020 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
1c030 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
1c040 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
1c050 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
1c060 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
1c070 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
1c080 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1c090 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
1c0a0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
1c0b0 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
1c0c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1c0d0 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a  ile and into .**
1c0e0 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
1c0f0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
1c100 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
1c110 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
1c120 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
1c130 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1c140 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1c150 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
1c160 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
1c170 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
1c180 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
1c190 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
1c1a0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
1c1b0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1c1c0 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
1c1d0 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
1c1e0 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
1c1f0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1c200 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
1c210 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
1c220 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1c230 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1c240 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
1c250 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1c260 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1c270 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1c280 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1c290 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50   page pPg */.  P
1c2a0 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
1c2b0 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50  pgno;       /* P
1c2c0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65  age number to re
1c2d0 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ad */.  int rc =
1c2e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1c2f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1c300 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ode */.  int isI
1c310 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  nWal = 0;       
1c320 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1c330 20 70 61 67 65 20 69 73 20 69 6e 20 6c 6f 67 20   page is in log 
1c340 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  file */.  int pg
1c350 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  sz = pPager->pag
1c360 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72  eSize; /* Number
1c370 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
1c380 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
1c390 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1c3a0 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
1c3b0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
1c3c0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1c3d0 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28  r->fd) );..  if(
1c3e0 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e 28 70   NEVER(!isOpen(p
1c3f0 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20  Pager->fd)) ){. 
1c400 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c410 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1c420 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
1c430 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
1c440 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1c450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c460 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  ;.  }..  if( pag
1c470 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1c480 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74   ){.    /* Try t
1c490 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20  o pull the page 
1c4a0 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61  from the write-a
1c4b0 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20  head log. */.   
1c4c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1c4d0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 70 57 61  Read(pPager->pWa
1c4e0 6c 2c 20 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61  l, pgno, &isInWa
1c4f0 6c 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44  l, pgsz, pPg->pD
1c500 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ata);.  }.  if( 
1c510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c520 20 21 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20   !isInWal ){.   
1c530 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28   i64 iOffset = (
1c540 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1c550 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1c560 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1c570 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1c580 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1c590 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  sz, iOffset);.  
1c5a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c5b0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c5c0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
1c5d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c5e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f  .  }..  if( pgno
1c5f0 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==1 ){.    if( r
1c600 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
1c610 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73   the read is uns
1c620 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1c630 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  he dbFileVers[] 
1c640 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20  to something.   
1c650 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20     ** that will 
1c660 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64  never be a valid
1c670 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20   file version.  
1c680 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1c690 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  a copy.      ** 
1c6a0 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20  of bytes 24..39 
1c6b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1c6c0 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73    Bytes 28..31 s
1c6d0 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a  hould always be.
1c6e0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72        ** zero or
1c6f0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1c700 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1c710 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20  e. Bytes 32..35 
1c720 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20  and 35..39.     
1c730 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61   ** should be pa
1c740 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68  ge numbers which
1c750 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66   are never 0xfff
1c760 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69  fffff.  So filli
1c770 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67  ng.      ** pPag
1c780 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d  er->dbFileVers[]
1c790 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62   with all 0xff b
1c7a0 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66  ytes should suff
1c7b0 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ice..      **.  
1c7c0 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e      ** For an en
1c7d0 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
1c7e0 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20  , the situation 
1c7f0 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a  is more complex:
1c800 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a    bytes.      **
1c810 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1c820 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74  atabase are whit
1c830 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68  e noise.  But th
1c840 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
1c850 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20  .      ** white 
1c860 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e 67  noising equaling
1c870 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66   16 bytes of 0xf
1c880 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79  f is vanishingly
1c890 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20   small so.      
1c8a0 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69  ** we should sti
1c8b0 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20  ll be ok..      
1c8c0 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  */.      memset(
1c8d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c8e0 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  rs, 0xff, sizeof
1c8f0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1c900 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ers));.    }else
1c910 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69  {.      u8 *dbFi
1c920 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29  leVers = &((u8*)
1c930 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b  pPg->pData)[24];
1c940 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
1c950 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1c960 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1c970 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1c980 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1c990 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  }.  }.  CODEC1(p
1c9a0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
1c9b0 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d  a, pgno, 3, rc =
1c9c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
1c9d0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1c9e0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1c9f0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1ca00 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1ca10 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1ca20 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1ca30 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1ca40 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
1ca50 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
1ca60 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1ca70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ca80 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1ca90 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1caa0 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1cab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1cac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1cad0 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
1cae0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
1caf0 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20  nvoked once for 
1cb00 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68  each page that h
1cb10 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1cb20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
1cb30 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68   the log file wh
1cb40 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  en a WAL transac
1cb50 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1cb60 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ack..** Paramete
1cb70 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67  r iPg is the pag
1cb80 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64  e number of said
1cb90 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20   page. The pCtx 
1cba0 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20  argument .** is 
1cbb0 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74  actually a point
1cbc0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
1cbd0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
1cbe0 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20   If page iPg is 
1cbf0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63  present in the c
1cc00 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f  ache, and has no
1cc10 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1cc20 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69  erences,.** it i
1cc30 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68  s discarded. Oth
1cc40 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
1cc50 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
1cc60 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
1cc70 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20  references, the 
1cc80 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
1cc90 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  reloaded from th
1cca0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
1ccb0 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  he.** attempt to
1ccc0 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20   reload content 
1ccd0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1cce0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e  e is required an
1ccf0 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74  d fails, .** ret
1cd00 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
1cd10 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
1cd20 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
1cd30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1cd40 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1cd50 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f  void *pCtx, Pgno
1cd60 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20   iPg){.  int rc 
1cd70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1cd80 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1cd90 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20  Pager *)pCtx;.  
1cda0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70  PgHdr *pPg;..  p
1cdb0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
1cdc0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
1cdd0 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20  iPg);.  if( pPg 
1cde0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1cdf0 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
1ce00 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a  ount(pPg)==1 ){.
1ce10 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
1ce20 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
1ce30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1ce40 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1ce50 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1ce60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ce70 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1ce80 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1ce90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1cea0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1ceb0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1cec0 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  .  /* Normally, 
1ced0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1cee0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1cef0 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63   any backup proc
1cf00 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75  esses are.  ** u
1cf10 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69  pdated as data i
1cf20 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  s copied out of 
1cf30 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1cf40 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68  rnal and into th
1cf50 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
1cf60 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e   This is not gen
1cf70 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  erally possible 
1cf80 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62  with a WAL datab
1cf90 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c  ase, as.  ** rol
1cfa0 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73  lback involves s
1cfb0 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67  imply truncating
1cfc0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54   the log file. T
1cfd0 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65  herefore, if one
1cfe0 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72  .  ** or more fr
1cff0 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
1d000 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1d010 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74  o the log (and t
1d020 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61  herefore .  ** a
1d030 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  lso copied into 
1d040 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62  the backup datab
1d050 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66  ases) as part of
1d060 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1d070 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b  n,.  ** the back
1d080 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74  ups must be rest
1d090 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  arted..  */.  sq
1d0a0 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
1d0b0 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
1d0c0 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  up);..  return r
1d0d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1d0e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d0f0 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
1d100 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
1d110 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e   a WAL database.
1d120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1d130 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
1d140 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1d150 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d170 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1d180 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1d190 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1d1a0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1d1b0 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1d1c0 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20  revert */..  /* 
1d1d0 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  For all pages in
1d1e0 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1d1f0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69  are currently di
1d200 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65  rty or have alre
1d210 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72  ady.  ** been wr
1d220 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63  itten (but not c
1d230 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65  ommitted) to the
1d240 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e   log file, do on
1d250 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66  e of the .  ** f
1d260 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
1d270 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20   **   + Discard 
1d280 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20  the cached page 
1d290 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29  (if refcount==0)
1d2a0 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65  , or.  **   + Re
1d2b0 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
1d2c0 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1d2d0 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  ase (if refcount
1d2e0 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  >0)..  */.  pPag
1d2f0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1d300 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
1d310 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1d320 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  alUndo(pPager->p
1d330 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61  Wal, pagerUndoCa
1d340 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
1d350 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74  pPager);.  pList
1d360 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1d370 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1d380 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68  ->pPCache);.  wh
1d390 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63  ile( pList && rc
1d3a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d3b0 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
1d3c0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1d3d0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
1d3e0 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69  ndoCallback((voi
1d3f0 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  d *)pPager, pLis
1d400 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  t->pgno);.    pL
1d410 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d  ist = pNext;.  }
1d420 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1d430 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1d440 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  laration */.stat
1d450 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
1d460 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1d470 50 61 67 65 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a  Pager*,int);../*
1d480 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1d490 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
1d4a0 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
1d4b0 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
1d4c0 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
1d4d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d4e0 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
1d4f0 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
1d500 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
1d510 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
1d520 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
1d530 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
1d540 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
1d550 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
1d560 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ve.** changed..*
1d570 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66  *.** The list of
1d580 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e   pages passed in
1d590 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1d5a0 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64  is always sorted
1d5b0 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e   by page number.
1d5c0 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61  .** Hence, if pa
1d5d0 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79  ge 1 appears any
1d5e0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73  where on the lis
1d5f0 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68  t, it will be th
1d600 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f  e first page..*/
1d610 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67   .static int pag
1d620 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50  erWalFrames(.  P
1d630 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d650 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1d660 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74  /.  PgHdr *pList
1d670 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d680 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1d690 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a  rames to log */.
1d6a0 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65    Pgno nTruncate
1d6b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d6c0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
1d6d0 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f  ze after this co
1d6e0 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  mmit */.  int is
1d6f0 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20 20 20  Commit,         
1d700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d710 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63  e if this is a c
1d720 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73  ommit */.  int s
1d730 79 6e 63 46 6c 61 67 73 20 20 20 20 20 20 20 20  yncFlags        
1d740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
1d750 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 4f  ags to pass to O
1d760 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29 20 2a  sSync() (or 0) *
1d770 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1d7a0 20 63 6f 64 65 20 2a 2f 0a 23 69 66 20 64 65 66   code */.#if def
1d7b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1d7c0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1d7d0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1d7e0 29 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  ).  PgHdr *p;   
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d800 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1d810 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f  ng over pages */
1d820 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1d830 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  t( pPager->pWal 
1d840 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1d850 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
1d860 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
1d870 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65   list is in acce
1d880 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
1d890 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20   for(p=pList; p 
1d8a0 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d  && p->pDirty; p=
1d8b0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1d8c0 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20  assert( p->pgno 
1d8d0 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e  < p->pDirty->pgn
1d8e0 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  o );.  }.#endif.
1d8f0 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67  .  if( pList->pg
1d900 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 70 50 61  no==1 ){.    pPa
1d910 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1d920 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 61  Done = 0;.    pa
1d930 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1d940 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 30 29  ounter(pPager,0)
1d950 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
1d960 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1d970 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  0;.  }.  rc = sq
1d980 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70  lite3WalFrames(p
1d990 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
1d9a0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
1d9b0 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72  Size, pList, nTr
1d9c0 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74  uncate, isCommit
1d9d0 2c 20 73 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b  , syncFlags.  );
1d9e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d9f0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
1da00 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50  pBackup ){.    P
1da10 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
1da20 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1da30 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1da40 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
1da50 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
1da60 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
1da70 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
1da80 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
1da90 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1daa0 41 47 45 53 0a 20 20 66 6f 72 28 70 3d 70 4c 69  AGES.  for(p=pLi
1dab0 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
1dac0 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73  ty){.    pager_s
1dad0 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a  et_pagehash(p);.
1dae0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
1daf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1db00 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74  * Begin a read t
1db10 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1db20 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  e WAL..**.** Thi
1db30 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  s routine used t
1db40 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67  o be called "pag
1db50 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29  erOpenSnapshot()
1db60 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73  " because it ess
1db70 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  entially.** make
1db80 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20  s a snapshot of 
1db90 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
1dba0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e  the current poin
1dbb0 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72  t in time and pr
1dbc0 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20  eserves.** that 
1dbd0 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65  snapshot for use
1dbe0 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69   by the reader i
1dbf0 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75  n spite of concu
1dc00 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20  rrently changes 
1dc10 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74  by.** other writ
1dc20 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e  ers or checkpoin
1dc30 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
1dc40 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65  int pagerBeginRe
1dc50 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  adTransaction(Pa
1dc60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1dc70 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc90 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1dca0 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20  /.  int changed 
1dcb0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1dcc0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
1dcd0 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73  ache must be res
1dce0 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
1dcf0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1dd00 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
1dd10 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1dd20 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  ==PAGER_OPEN || 
1dd30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1dd40 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
1dd50 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c  .  /* sqlite3Wal
1dd60 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
1dd70 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  on() was not cal
1dd80 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76  led for the prev
1dd90 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ious.  ** transa
1dda0 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67  ction in locking
1ddb0 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e  _mode=EXCLUSIVE.
1ddc0 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77    So call it now
1ddd0 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72  .  If we.  ** ar
1dde0 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e in locking_mod
1ddf0 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64  e=NORMAL and End
1de00 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69  Read() was previ
1de10 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20  ously called,.  
1de20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  ** the duplicate
1de30 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73   call is harmles
1de40 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
1de50 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
1de60 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1de70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Wal);..  rc = sq
1de80 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61  lite3WalBeginRea
1de90 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1dea0 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e  ger->pWal, &chan
1deb0 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ged);.  if( rc!=
1dec0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61  SQLITE_OK || cha
1ded0 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65  nged ){.    page
1dee0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1def0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1df00 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
1df10 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1df20 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
1df30 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  rt of the transi
1df40 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f  tion from PAGER_
1df50 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52  OPEN.** to PAGER
1df60 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f  _READER state to
1df70 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1df80 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1df90 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70  ase file.** in p
1dfa0 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74  ages (assuming t
1dfb0 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72  he page size cur
1dfc0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
1dfd0 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29   Pager.pageSize)
1dfe0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
1dff0 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
1e000 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e010 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  d and the size o
1e020 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
1e030 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74  * in pages is st
1e040 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e  ored in *pnPage.
1e050 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
1e060 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61  rror code (perha
1e070 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  ps.** SQLITE_IOE
1e080 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74  RR_FSTAT) is ret
1e090 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
1e0a0 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  e is left unmodi
1e0b0 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
1e0c0 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75  int pagerPagecou
1e0d0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1e0e0 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b  , Pgno *pnPage){
1e0f0 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20  .  Pgno nPage;  
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
1e120 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
1e130 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79  e */..  /* Query
1e140 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1e150 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61  tem for the data
1e160 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57  base size. The W
1e170 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20  alDbsize().  ** 
1e180 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1e190 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c   zero if the WAL
1e1a0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e   is not open (i.
1e1b0 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30  e. Pager.pWal==0
1e1c0 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68  ), or.  ** if th
1e1d0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1e1e0 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1e1f0 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1e200 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ize is not.  ** 
1e210 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
1e220 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1e230 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c  m if the log fil
1e240 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20  e is empty or.  
1e250 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76  ** contains no v
1e260 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74  alid committed t
1e270 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  ransactions..  *
1e280 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1e290 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1e2a0 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
1e2b0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1e2c0 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k>=SHARED_LOCK |
1e2d0 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64  | pPager->noRead
1e2e0 6c 6f 63 6b 20 29 3b 0a 20 20 6e 50 61 67 65 20  lock );.  nPage 
1e2f0 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69  = sqlite3WalDbsi
1e300 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  ze(pPager->pWal)
1e310 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
1e320 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
1e330 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
1e340 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
1e350 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74  system,.  ** det
1e360 65 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20  ermine it based 
1e370 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  on the size of t
1e380 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e390 2e 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20  . If the size.  
1e3a0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
1e3b0 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  se file is not a
1e3c0 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
1e3d0 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
1e3e0 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20  ize,.  ** round 
1e3f0 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72  down to the near
1e400 65 73 74 20 70 61 67 65 2e 20 45 78 63 65 70 74  est page. Except
1e410 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65  , any file large
1e420 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79  r than 0.  ** by
1e430 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63  tes in size is c
1e440 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e  onsidered to con
1e450 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tain at least on
1e460 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  e page..  */.  i
1e470 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
1e480 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20     i64 n = 0;   
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66   /* Size of db f
1e4b0 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1e4c0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
1e4d0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1e4e0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1e4f0 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  le );.    if( is
1e500 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1e510 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1e520 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1e530 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
1e540 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20   &n);.      if( 
1e550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e560 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1e570 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1e580 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50  }.    nPage = (P
1e590 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d  gno)(n / pPager-
1e5a0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1e5b0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20  if( nPage==0 && 
1e5c0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  n>0 ){.      nPa
1e5d0 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ge = 1;.    }.  
1e5e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
1e5f0 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
1e600 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
1e610 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
1e620 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66  an the.  ** conf
1e630 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
1e640 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
1e650 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
1e660 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
1e670 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
1e680 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
1e690 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
1e6a0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
1e6b0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
1e6c0 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
1e6d0 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d    }..  *pnPage =
1e6e0 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
1e6f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1e700 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e710 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65  IT_WAL./*.** Che
1e720 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
1e730 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
1e740 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
1e750 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
1e760 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
1e770 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1e780 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72   is not empy, or
1e790 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1e7a0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
1e7b0 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62  .** not exist (b
1e7c0 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69  y deleting it) i
1e7d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e7e0 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ile is empty..**
1e7f0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
1e800 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ase is not empty
1e810 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66   and the *-wal f
1e820 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e  ile exists, open
1e830 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e   the pager.** in
1e840 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74   WAL mode.  If t
1e850 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
1e860 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d  mpty or if no *-
1e870 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  wal file exists 
1e880 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72  and.** if no err
1e890 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20  or occurs, make 
1e8a0 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  sure Pager.journ
1e8b0 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65  alMode is not se
1e8c0 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f  t to.** PAGER_JO
1e8d0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a  URNALMODE_WAL..*
1e8e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1e8f0 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f  TE_OK or an erro
1e900 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r code..**.** Th
1e910 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f  e caller must ho
1e920 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ld a SHARED lock
1e930 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1e940 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68   file to call th
1e950 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
1e960 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55  Because an EXCLU
1e970 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1e980 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75   db file is requ
1e990 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a  ired to delete .
1e9a0 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f  ** a WAL on a no
1e9b0 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73  ne-empty databas
1e9c0 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
1e9d0 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65  there is no race
1e9e0 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62   condition .** b
1e9f0 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65  etween the xAcce
1ea00 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61  ss() below and a
1ea10 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e  n xDelete() bein
1ea20 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f  g executed by so
1ea30 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e  me .** other con
1ea40 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
1ea50 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
1ea60 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67  WalIfPresent(Pag
1ea70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1ea80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ea90 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
1eaa0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1eab0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
1eac0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1ead0 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
1eae0 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  || pPager->noRea
1eaf0 64 6c 6f 63 6b 20 29 3b 0a 0a 20 20 69 66 28 20  dlock );..  if( 
1eb00 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1eb10 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57  e ){.    int isW
1eb20 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1eb30 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1eb40 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74  f WAL file exist
1eb50 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50  s */.    Pgno nP
1eb60 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1eb70 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1eb80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1eb90 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d  ile */..    rc =
1eba0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1ebb0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
1ebc0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1ebd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
1ebe0 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1ebf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1ec00 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
1ec10 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
1ec20 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 73  al, 0);.      is
1ec30 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Wal = 0;.    }el
1ec40 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
1ec50 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
1ec60 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1ec70 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
1ec80 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  zWal, SQLITE_ACC
1ec90 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57  ESS_EXISTS, &isW
1eca0 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  al.      );.    
1ecb0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1ecc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ecd0 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20   if( isWal ){.  
1ece0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ecf0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1ed00 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
1ed10 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
1ed20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ed30 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
1ed40 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
1ed50 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
1ed60 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
1ed70 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1ed80 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
1ed90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1eda0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
1edb0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
1edc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1edd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ede0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1edf0 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
1ee00 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
1ee10 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
1ee20 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
1ee30 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
1ee40 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
1ee50 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
1ee60 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
1ee70 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
1ee80 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
1ee90 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
1eea0 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
1eeb0 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
1eec0 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
1eed0 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
1eee0 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
1eef0 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
1ef00 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
1ef10 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
1ef20 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
1ef30 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
1ef40 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
1ef50 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
1ef60 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
1ef70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
1ef80 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
1ef90 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
1efa0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
1efb0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
1efc0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
1efd0 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
1efe0 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
1eff0 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
1f000 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
1f010 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
1f020 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1f030 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
1f040 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1f050 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
1f060 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
1f070 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
1f080 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
1f090 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
1f0a0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
1f0b0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
1f0c0 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
1f0d0 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
1f0e0 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
1f0f0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
1f100 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
1f110 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
1f120 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1f130 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
1f140 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1f150 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
1f160 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
1f170 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
1f180 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
1f190 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
1f1a0 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
1f1b0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
1f1c0 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
1f1d0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
1f1e0 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
1f1f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
1f200 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
1f210 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
1f220 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
1f230 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
1f240 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
1f250 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
1f260 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
1f270 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
1f280 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
1f290 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
1f2a0 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
1f2b0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
1f2c0 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
1f2d0 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
1f2e0 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
1f2f0 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
1f300 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
1f310 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
1f320 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
1f330 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
1f340 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
1f350 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
1f360 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
1f370 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
1f380 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
1f390 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
1f3a0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
1f3b0 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
1f3c0 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
1f3d0 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
1f3e0 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
1f3f0 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
1f400 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
1f410 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
1f420 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
1f430 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
1f440 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
1f450 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
1f460 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
1f470 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
1f480 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
1f490 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
1f4a0 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
1f4b0 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
1f4c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
1f4d0 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
1f4e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1f4f0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
1f500 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
1f510 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
1f520 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
1f530 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
1f540 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
1f550 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
1f560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
1f570 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
1f580 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
1f590 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
1f5a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f5b0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
1f5c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
1f5d0 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
1f5e0 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
1f5f0 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
1f600 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
1f610 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
1f620 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1f630 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
1f640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f650 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1f660 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
1f670 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
1f680 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75  te a bitvec to u
1f690 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
1f6a0 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c  set of pages rol
1f6b0 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66  led back */.  if
1f6c0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
1f6d0 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69      pDone = sqli
1f6e0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
1f6f0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
1f700 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f  g);.    if( !pDo
1f710 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ne ){.      retu
1f720 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1f730 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1f740 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
1f750 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
1f760 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
1f770 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
1f780 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
1f790 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
1f7a0 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
1f7b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
1f7c0 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
1f7d0 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
1f7e0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1f7f0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
1f800 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
1f810 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
1f820 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
1f830 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
1f840 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
1f850 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
1f860 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
1f870 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
1f880 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f890 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
1f8a0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
1f8b0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
1f8c0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
1f8d0 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
1f8e0 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
1f8f0 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
1f900 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1f910 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
1f920 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1f930 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
1f940 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
1f950 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f960 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
1f970 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
1f980 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
1f990 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
1f9a0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1f9b0 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
1f9c0 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
1f9d0 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
1f9e0 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
1f9f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1fa00 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
1fa10 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
1fa20 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
1fa30 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
1fa40 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1fa50 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
1fa60 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
1fa70 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
1fa80 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
1fa90 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
1faa0 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
1fab0 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
1fac0 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
1fad0 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
1fae0 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
1faf0 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
1fb00 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
1fb10 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
1fb20 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
1fb30 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
1fb40 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
1fb50 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
1fb60 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
1fb70 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
1fb80 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
1fb90 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
1fba0 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
1fbb0 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
1fbc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
1fbd0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
1fbe0 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
1fbf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1fc00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1fc10 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
1fc20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1fc30 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1fc40 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
1fc50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
1fc60 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
1fc70 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
1fc80 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
1fc90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
1fca0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1fcb0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1fcc0 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
1fcd0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
1fce0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
1fcf0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
1fd00 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
1fd10 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1fd20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
1fd30 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
1fd40 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
1fd50 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1fd60 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
1fd70 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
1fd80 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
1fd90 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
1fda0 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
1fdb0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
1fdc0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
1fdd0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1fde0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1fdf0 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
1fe00 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
1fe10 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1fe20 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
1fe30 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
1fe40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
1fe50 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
1fe60 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
1fe70 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1fe80 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
1fe90 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
1fea0 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
1feb0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
1fec0 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
1fed0 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
1fee0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
1fef0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1ff00 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
1ff10 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
1ff20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
1ff30 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
1ff40 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
1ff50 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
1ff60 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
1ff70 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
1ff80 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1ff90 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
1ffa0 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
1ffb0 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
1ffc0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
1ffd0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1ffe0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
1fff0 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
20000 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
20010 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
20020 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
20030 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
20040 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
20050 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
20060 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
20070 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
20080 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
20090 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
200a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
200b0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
200c0 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
200d0 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
200e0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
200f0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
20100 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
20110 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20120 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
20130 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
20140 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
20150 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
20160 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
20170 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
20180 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
20190 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
201a0 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
201b0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
201c0 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
201d0 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
201e0 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
201f0 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
20200 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
20210 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
20220 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
20230 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
20240 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20250 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
20260 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  et = pSavepoint-
20270 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >iSubRec*(4+pPag
20280 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
20290 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
202a0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
202b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
202c0 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64  3WalSavepointUnd
202d0 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
202e0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c  pSavepoint->aWal
202f0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
20300 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69   for(ii=pSavepoi
20310 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d  nt->iSubRec; rc=
20320 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
20330 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  <pPager->nSubRec
20340 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
20350 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 69  ssert( offset==i
20360 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
20370 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
20380 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
20390 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
203a0 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
203b0 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
203c0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
203d0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
203e0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
203f0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
20400 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
20410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20420 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20430 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
20440 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20450 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
20460 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
20470 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
20480 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
20490 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
204a0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
204b0 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
204c0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
204d0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
204e0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
204f0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
20500 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
20510 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
20520 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
20530 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
20540 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
20550 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
20560 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
20570 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
20580 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
20590 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
205a0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
205b0 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
205c0 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
205d0 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
205e0 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
205f0 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
20600 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
20610 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
20620 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
20630 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
20640 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
20650 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
20660 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
20670 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
20680 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
206a0 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
206b0 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
206c0 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
206d0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
206e0 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
206f0 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
20700 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
20710 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
20720 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
20730 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
20740 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
20750 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
20760 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20770 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
20780 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
20790 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
207a0 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
207b0 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
207c0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
207d0 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
207e0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
207f0 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
20800 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
20810 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
20820 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
20830 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
20840 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
20850 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
20860 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
20870 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
20880 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
20890 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
208a0 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
208b0 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
208c0 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
208d0 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
208e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
208f0 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
20900 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
20910 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
20920 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
20930 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
20940 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
20950 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
20960 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
20980 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
20990 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
209a0 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
209b0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lback..**.** The
209c0 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20   above is for a 
209d0 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
209e0 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20   mode.  For WAL 
209f0 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e  mode, OFF contin
20a00 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74  ues.** to mean t
20a10 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65  hat no syncs eve
20a20 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c  r occur.  NORMAL
20a30 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
20a40 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  WAL is synced.**
20a50 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
20a60 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e  art of checkpoin
20a70 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  t and that the d
20a80 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
20a90 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65  synced.** at the
20aa0 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74   conclusion of t
20ab0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  he checkpoint if
20ac0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
20ad0 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a  ent of the WAL.*
20ae0 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61  * was written ba
20af0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
20b00 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79  base.  But no sy
20b10 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63  nc operations oc
20b20 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72  cur for.** an or
20b30 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e  dinary commit in
20b40 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74   NORMAL mode wit
20b50 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61  h WAL.  FULL mea
20b60 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a  ns that the WAL.
20b70 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  ** file is synce
20b80 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  d following each
20b90 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f   commit operatio
20ba0 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74  n, in addition t
20bb0 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61  o the.** syncs a
20bc0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e  ssociated with N
20bd0 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20  ORMAL..**.** Do 
20be0 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63  not confuse sync
20bf0 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74  hronous=FULL wit
20c00 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  h SQLITE_SYNC_FU
20c10 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49  LL.  The.** SQLI
20c20 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63  TE_SYNC_FULL mac
20c30 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20  ro means to use 
20c40 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65  the MacOSX-style
20c50 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75   full-fsync.** u
20c60 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c  sing fcntl(F_FUL
20c70 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45  LFSYNC).  SQLITE
20c80 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61  _SYNC_NORMAL mea
20c90 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f  ns to do an.** o
20ca0 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20  rdinary fsync() 
20cb0 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20  call.  There is 
20cc0 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  no difference be
20cd0 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e  tween SQLITE_SYN
20ce0 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51  C_FULL.** and SQ
20cf0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
20d00 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74   on platforms ot
20d10 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e  her than MacOSX.
20d20 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e    But the.** syn
20d30 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65  chronous=FULL ve
20d40 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73  rsus synchronous
20d50 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20  =NORMAL setting 
20d60 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a  determines when.
20d70 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69  ** the xSync pri
20d80 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64  mitive is called
20d90 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74   and is relevant
20da0 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d   to all platform
20db0 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  s..**.** Numeric
20dc0 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
20dd0 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
20de0 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
20df0 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
20e00 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
20e10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20e20 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
20e30 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
20e40 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 0a  SetSafetyLevel(.
20e50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
20e60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
20e70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61 66 65  ager to set safe
20e80 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a  ty level for */.
20e90 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20 20    int level,    
20ea0 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d          /* PRAGM
20eb0 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 20 20  A synchronous.  
20ec0 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c 2c  1=OFF, 2=NORMAL,
20ed0 20 33 3d 46 55 4c 4c 20 2a 2f 20 20 0a 20 20 69   3=FULL */  .  i
20ee0 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 2c 20 20  nt bFullFsync,  
20ef0 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 66       /* PRAGMA f
20f00 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 20 20 69 6e  ullfsync */.  in
20f10 74 20 62 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63  t bCkptFullFsync
20f20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 63 68      /* PRAGMA ch
20f30 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79  eckpoint_fullfsy
20f40 6e 63 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  nc */.){.  asser
20f50 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c  t( level>=1 && l
20f60 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61  evel<=3 );.  pPa
20f70 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28  ger->noSync =  (
20f80 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
20f90 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
20fa0 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
20fb0 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d  llSync = (level=
20fc0 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
20fd0 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
20fe0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
20ff0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
21000 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30  r->syncFlags = 0
21010 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
21020 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b  ptSyncFlags = 0;
21030 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 46 75  .  }else if( bFu
21040 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70  llFsync ){.    p
21050 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
21060 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
21070 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ULL;.    pPager-
21080 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
21090 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
210a0 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62  L;.  }else if( b
210b0 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63 20 29 7b  CkptFullFsync ){
210c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
210d0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
210e0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
210f0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
21100 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
21110 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c  SYNC_FULL;.  }el
21120 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
21130 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
21140 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
21150 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
21160 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
21170 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
21180 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
21190 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
211a0 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
211b0 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
211c0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
211d0 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
211e0 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
211f0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
21200 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
21210 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
21220 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
21230 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
21240 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
21250 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
21260 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
21270 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
21280 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
21290 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ile..**.** Write
212a0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
212b0 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65  ptor into *pFile
212c0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
212d0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a  OK on success .*
212e0 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
212f0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
21300 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
21310 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
21320 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
21330 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
21340 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
21350 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
21360 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
21370 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28  VFS layer xOpen(
21380 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65  ) call are those
21390 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
213a0 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c   parameter vfsFl
213b0 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68  ags ORed with th
213c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
213d0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
213e0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20  EN_READWRITE.** 
213f0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
21400 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51  CREATE.**     SQ
21410 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
21420 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  IVE.**     SQLIT
21430 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
21440 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOSE.*/.static i
21450 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70  nt pagerOpentemp
21460 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
21470 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
21480 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   pager object */
21490 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
214a0 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74  *pFile,  /* Writ
214b0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
214c0 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
214d0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
214e0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
214f0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
21500 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20   the VFS */.){. 
21510 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
21520 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
21530 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66   code */..#ifdef
21540 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
21550 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
21560 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
21570 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
21580 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
21590 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73  */.#endif..  vfs
215a0 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45  Flags |=  SQLITE
215b0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
215c0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
215d0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
215e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
215f0 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
21600 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
21610 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c  LOSE;.  rc = sql
21620 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65  ite3OsOpen(pPage
21630 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c  r->pVfs, 0, pFil
21640 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b  e, vfsFlags, 0);
21650 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
21660 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
21670 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72  en(pFile) );.  r
21680 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21690 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
216a0 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
216b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
216c0 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75  r invokes the bu
216d0 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71  sy-handler if sq
216e0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65  lite3OsLock() re
216f0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
21700 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e  _BUSY when tryin
21710 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
21720 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53  m no-lock to a S
21730 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f  HARED lock,.** o
21740 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  r when trying to
21750 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
21760 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
21770 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a   an EXCLUSIVE .*
21780 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20  * lock. It does 
21790 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65  *not* invoke the
217a0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68   busy handler wh
217b0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
217c0 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52  m.** SHARED to R
217d0 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e  ESERVED, or when
217e0 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20   upgrading from 
217f0 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53  SHARED to EXCLUS
21800 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63  IVE.** (which oc
21810 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d  curs during hot-
21820 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
21830 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a  ). Summary:.**.*
21840 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20  *   Transition  
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21860 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20        | Invokes 
21870 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20  xBusyHandler.** 
21880 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
21890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
218a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
218b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
218c0 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e  NO_LOCK       ->
218d0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20   SHARED_LOCK    
218e0 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41    | Yes.**   SHA
218f0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45  RED_LOCK   -> RE
21900 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c  SERVED_LOCK    |
21910 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f   No.**   SHARED_
21920 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53  LOCK   -> EXCLUS
21930 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a  IVE_LOCK   | No.
21940 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f  **   RESERVED_LO
21950 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f  CK -> EXCLUSIVE_
21960 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a  LOCK   | Yes.**.
21970 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68  ** If the busy-h
21980 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
21990 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
219a0 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  , the lock is .*
219b0 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74  * retried. If it
219c0 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74   returns zero, t
219d0 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42  hen the SQLITE_B
219e0 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  USY error is.** 
219f0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
21a00 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61  caller of the pa
21a10 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
21a20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21a30 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
21a40 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70  dler(.  Pager *p
21a50 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21a70 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
21a80 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
21a90 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20  dler)(void *),  
21aa0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
21ab0 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65  r to busy-handle
21ac0 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
21ad0 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
21ae0 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20  erArg           
21af0 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
21b00 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73   to pass to xBus
21b10 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20  yHandler */.){  
21b20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
21b30 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
21b40 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
21b50 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
21b60 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
21b70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  Arg;.}../*.** Ch
21b80 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
21b90 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
21ba0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
21bb0 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
21bc0 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
21bd0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
21be0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
21bf0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
21c00 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
21c10 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
21c20 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
21c30 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
21c40 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
21c50 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
21c60 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
21c70 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
21c80 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  ERR, an SQLITE_I
21c90 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64  OERR_xxx sub-cod
21ca0 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e or SQLITE_FULL
21cb0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
21cc0 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
21cd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
21ce0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
21cf0 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
21d00 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
21d10 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
21d20 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
21d30 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
21d40 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
21d50 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
21d60 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
21d70 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
21d80 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
21d90 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
21da0 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
21db0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
21dc0 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
21dd0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
21de0 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
21df0 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
21e00 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
21e10 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
21e20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
21e30 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
21e40 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
21e50 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
21e60 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
21e70 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
21e80 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
21e90 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
21ea0 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
21eb0 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
21ec0 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
21ed0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
21ee0 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
21ef0 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
21f00 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
21f10 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
21f20 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
21f30 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
21f40 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
21f50 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
21f60 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
21f70 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
21f80 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
21f90 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
21fa0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
21fb0 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
21fc0 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
21fd0 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
21fe0 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
21ff0 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
22000 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
22010 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
22020 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
22030 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
22040 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
22050 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
22060 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
22070 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
22080 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
22090 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
220a0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
220b0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
220c0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
220d0 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c   u32 *pPageSize,
220e0 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
220f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22100 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  E_OK;..  /* It i
22110 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
22120 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65  o do a full asse
22130 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
22140 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20   here, as this. 
22150 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79   ** function may
22160 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
22170 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e  within PagerOpen
22180 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73  (), before the s
22190 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
221a0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   Pager object is
221b0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
221c0 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  istent..  **.  *
221d0 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
221e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
221f0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
22200 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
22210 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45  in .  ** PAGER_E
22220 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20  RROR state. But 
22230 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f  since PAGER_ERRO
22240 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65  R state guarante
22250 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  es that.  ** the
22260 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  re is at least o
22270 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ne outstanding p
22280 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74  age reference, t
22290 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
222a0 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  * is a no-op for
222b0 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f   that case anyho
222c0 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70  w..  */..  u32 p
222d0 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
222e0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
222f0 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
22300 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
22310 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
22320 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
22330 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
22340 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
22350 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
22360 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50  ).   && sqlite3P
22370 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
22380 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
22390 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a  0 .   && pageSiz
223a0 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28  e && pageSize!=(
223b0 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
223c0 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63  Size .  ){.    c
223d0 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c  har *pNew = NULL
223e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
223f0 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20   New temp space 
22400 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65  */.    i64 nByte
22410 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
22420 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
22430 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70  GER_OPEN && isOp
22440 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
22450 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22460 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
22470 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74  Pager->fd, &nByt
22480 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
22490 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
224a0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
224b0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
224c0 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
224d0 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
224e0 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49  pNew ) rc = SQLI
224f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
22500 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22520 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
22530 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
22540 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e  r->dbSize = (Pgn
22550 6f 29 28 6e 42 79 74 65 2f 70 61 67 65 53 69 7a  o)(nByte/pageSiz
22560 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
22570 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
22580 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c  eSize;.      sql
22590 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
225a0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
225b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
225c0 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
225d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
225e0 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
225f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
22600 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
22610 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53  }.  }..  *pPageS
22620 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
22630 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63  geSize;.  if( rc
22640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22650 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
22660 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
22670 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
22680 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
22690 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
226a0 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
226b0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
226c0 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
226d0 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
226e0 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
226f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
22700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22710 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
22720 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
22730 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
22740 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
22750 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
22760 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
22770 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
22780 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
22790 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
227a0 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
227b0 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
227c0 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
227d0 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
227e0 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
227f0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
22800 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
22810 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
22820 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
22830 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
22840 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
22850 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
22860 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
22870 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
22880 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
22890 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
228a0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
228b0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
228c0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
228d0 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
228e0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
228f0 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
22900 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
22910 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
22920 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
22930 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
22940 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
22950 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
22960 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
22970 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
22980 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22990 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
229a0 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
229b0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
229c0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
229d0 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
229e0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
229f0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
22a00 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
22a10 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
22a20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
22a30 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
22a40 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
22a50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
22a60 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20  GER_OPEN );     
22a70 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20   /* Called only 
22a80 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a  by OP_MaxPgcnt *
22a90 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
22aa0 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
22ab0 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f  er->dbSize );  /
22ac0 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e  * OP_MaxPgcnt en
22ad0 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20  forces this */. 
22ae0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
22af0 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
22b00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
22b10 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
22b20 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
22b30 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
22b40 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
22b50 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
22b60 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
22b70 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
22b80 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
22b90 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
22ba0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
22bb0 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
22bc0 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
22bd0 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
22be0 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
22bf0 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
22c00 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
22c10 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
22c20 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
22c30 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
22c40 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
22c50 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
22c60 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
22c70 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
22c80 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
22c90 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
22ca0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
22cb0 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
22cc0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
22cd0 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
22ce0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
22cf0 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
22d00 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
22d10 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
22d20 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
22d30 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
22d40 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
22d50 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
22d60 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
22d70 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
22d80 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
22d90 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
22da0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
22db0 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
22dc0 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
22dd0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
22de0 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
22df0 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
22e00 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
22e10 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
22e20 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
22e30 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
22e40 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
22e50 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
22e60 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
22e70 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
22e80 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
22e90 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
22ea0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
22eb0 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
22ec0 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
22ed0 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
22ee0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
22ef0 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
22f00 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
22f10 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
22f20 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
22f30 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
22f40 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
22f50 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
22f60 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
22f70 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
22f80 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
22f90 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
22fa0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
22fb0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
22fc0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
22fd0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
22fe0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
22ff0 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
23000 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
23010 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
23020 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
23030 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
23040 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
23050 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
23060 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
23070 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
23080 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
23090 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
230a0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
230b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
230c0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
230d0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
230e0 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
230f0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
23100 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
23110 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
23120 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
23130 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
23140 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
23150 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
23160 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
23170 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
23180 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
23190 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
231a0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
231b0 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
231c0 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
231d0 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
231e0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
231f0 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
23200 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
23210 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
23220 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
23230 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23240 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
23250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23260 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23270 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
23280 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
23290 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
232a0 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
232b0 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
232c0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
232d0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
232e0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
232f0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
23300 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
23310 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
23320 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
23330 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
23340 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
23350 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
23360 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
23370 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
23380 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
23390 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
233a0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
233b0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
233c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
233d0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
233e0 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
233f0 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
23400 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
23410 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
23420 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
23430 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
23440 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
23450 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
23460 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
23470 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
23480 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
23490 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
234a0 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
234b0 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
234c0 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
234d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
234e0 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
234f0 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
23500 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
23510 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
23520 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
23530 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
23540 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
23550 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
23560 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
23570 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
23580 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
23590 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
235a0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
235b0 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
235c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
235d0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
235e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
235f0 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
23600 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
23610 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
23620 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
23630 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
23640 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
23650 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
23660 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
23670 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
23680 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
23690 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
236a0 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
236b0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
236e0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
236f0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
23700 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
23710 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
23720 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
23730 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
23740 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
23750 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
23760 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
23770 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
23780 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
23790 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
237a0 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
237b0 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
237c0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
237d0 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
237e0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
237f0 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
23800 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
23810 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
23820 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
23830 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
23840 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
23850 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
23860 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
23870 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
23880 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
23890 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
238a0 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
238b0 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
238c0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
238d0 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
238e0 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
238f0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
23900 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
23910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
23920 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
23930 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
23940 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
23950 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
23960 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
23970 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
23980 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
23990 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
239a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
239b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
239c0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
239d0 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
239e0 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
239f0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
23a00 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
23a10 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
23a20 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
23a30 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
23a40 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
23a50 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
23a60 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
23a70 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
23a80 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
23a90 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
23aa0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
23ab0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
23ac0 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
23ad0 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
23ae0 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
23af0 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
23b00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
23b10 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
23b20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
23b30 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
23b40 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
23b50 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
23b60 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
23b70 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
23b80 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
23b90 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
23ba0 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
23bb0 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
23bc0 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
23bd0 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
23be0 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
23bf0 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
23c00 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
23c10 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 75  correct behaviou
23c20 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
23c30 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
23c40 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
23c50 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
23c60 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
23c70 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
23c80 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
23c90 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
23ca0 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
23cb0 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
23cc0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
23cd0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
23ce0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
23cf0 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
23d00 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
23d10 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
23d20 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
23d30 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
23d40 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
23d50 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
23d60 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
23d70 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
23d80 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
23d90 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
23da0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
23db0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
23dc0 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
23dd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
23de0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
23df0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
23e00 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
23e10 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
23e20 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
23e30 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
23e40 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
23e50 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
23e60 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
23e70 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
23e80 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
23e90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
23ea0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
23eb0 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
23ec0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
23ed0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
23ee0 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
23ef0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
23f00 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
23f10 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
23f20 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
23f30 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
23f40 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
23f50 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
23f60 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
23f70 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
23f80 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
23f90 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
23fa0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
23fb0 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
23fc0 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
23fd0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
23fe0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
23ff0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
24000 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  mitted..*/.void 
24010 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
24020 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
24030 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
24040 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
24050 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
24060 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
24070 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24080 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
24090 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
240a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
240b0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72  Page;.  assertTr
240c0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
240d0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a  (pPager);.}.../*
240e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
240f0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
24100 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20  re attempting a 
24110 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
24120 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63  back. It.** sync
24130 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
24140 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e  le to disk, then
24150 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f   sets pPager->jo
24160 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a  urnalHdr to the.
24170 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  ** size of the j
24180 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74  ournal file so t
24190 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c  hat the pager_pl
241a0 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
241b0 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74   knows.** that t
241c0 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
241d0 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
241e0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79  synced..**.** Sy
241f0 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  ncing a hot-jour
24200 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f  nal to disk befo
24210 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
24220 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e   roll it back en
24230 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69  sures .** that i
24240 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  f a power-failur
24250 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  e occurs during 
24260 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  the rollback, th
24270 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a  e process that.*
24280 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62  * attempts rollb
24290 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79  ack following sy
242a0 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65  stem recovery se
242b0 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72  es the same jour
242c0 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  nal.** content a
242d0 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  s this process..
242e0 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
242f0 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e  ing goes as plan
24300 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ned, SQLITE_OK i
24310 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
24320 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51  rwise, .** an SQ
24330 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
24340 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
24350 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
24360 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
24370 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24380 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
24390 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
243a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
243b0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
243c0 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
243d0 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20  C_NORMAL);.  }. 
243e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
243f0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
24400 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
24410 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
24420 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
24430 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
24440 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
24450 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
24460 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
24470 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
24480 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
24490 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
244a0 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
244b0 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
244c0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
244d0 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
244e0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
244f0 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
24500 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
24510 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
24520 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
24530 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
24540 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
24550 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
24560 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
24570 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
24580 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
24590 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
245a0 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
245b0 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
245c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
245d0 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
245e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
245f0 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
24600 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
24610 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
24620 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
24630 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
24640 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
24650 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
24660 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
24670 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
24680 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
24690 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
246a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
246b0 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
246c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20   *pPager){.  u8 
246d0 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
246e0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
246f0 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
24700 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
24710 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
24720 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
24730 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
24740 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  rCode = 0; */.  
24750 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
24760 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eMode = 0;.#ifnd
24770 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
24780 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43  AL.  sqlite3WalC
24790 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61  lose(pPager->pWa
247a0 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  l, pPager->ckptS
247b0 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72  yncFlags, pPager
247c0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70  ->pageSize, pTmp
247d0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61  );.  pPager->pWa
247e0 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  l = 0;.#endif.  
247f0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
24800 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
24810 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
24820 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
24830 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
24840 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e   it is open, syn
24850 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
24860 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
24870 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  g UnlockAndRollb
24880 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ack..    ** If t
24890 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c  his is not done,
248a0 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65   then an unsynce
248b0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
248c0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20   open journal . 
248d0 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62     ** file may b
248e0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e  e played back in
248f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
24900 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
24910 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20  ure occurs .    
24920 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73  ** while this is
24930 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20   happening, the 
24940 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
24950 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20  ecome corrupt.. 
24960 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
24970 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
24980 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
24990 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
249a0 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65  , shift the page
249b0 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  r.    ** into th
249c0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54  e ERROR state. T
249d0 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63  his causes Unloc
249e0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20  kAndRollback to 
249f0 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a  unlock the.    *
24a00 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  * database and c
24a10 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
24a20 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74   file without at
24a30 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
24a40 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20   it.    ** back 
24a50 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20  or finalize it. 
24a60 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73  The next databas
24a70 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65  e user will have
24a80 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e   to do hot-journ
24a90 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  al.    ** rollba
24aa0 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73  ck before access
24ab0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
24ac0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
24ad0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
24ae0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
24af0 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
24b00 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63  Pager, pagerSync
24b10 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
24b20 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
24b30 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
24b40 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
24b50 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
24b60 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
24b70 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
24b80 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
24b90 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c   PAGERTRACE(("CL
24ba0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
24bb0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
24bc0 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
24bd0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
24be0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
24bf0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
24c00 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
24c10 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73  pPager->fd);.  s
24c20 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
24c30 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  Tmp);.  sqlite3P
24c40 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65  cacheClose(pPage
24c50 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69  r->pPCache);..#i
24c60 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
24c70 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67  CODEC.  if( pPag
24c80 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29  er->xCodecFree )
24c90 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
24ca0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  ree(pPager->pCod
24cb0 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ec);.#endif..  a
24cc0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
24cd0 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  aSavepoint && !p
24ce0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
24cf0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  l );.  assert( !
24d00 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
24d10 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
24d20 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a  Pager->sjfd) );.
24d30 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
24d40 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
24d50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24d60 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
24d70 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
24d80 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
24d90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
24da0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61  ge number for pa
24db0 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20  ge pPg..*/.Pgno 
24dc0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
24dd0 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
24de0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
24df0 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  g->pgno;.}.#endi
24e00 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
24e10 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
24e20 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
24e30 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  pPg..*/.void sql
24e40 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
24e50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c  age *pPg){.  sql
24e60 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50  ite3PcacheRef(pP
24e70 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  g);.}../*.** Syn
24e80 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49  c the journal. I
24e90 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
24ea0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
24eb0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
24ec0 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
24ed0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
24ee0 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
24ef0 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
24f00 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
24f10 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74   and can be rest
24f20 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ored in the even
24f30 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t of a hot-journ
24f40 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  al rollback..**.
24f50 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  ** If the Pager.
24f60 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  noSync flag is s
24f70 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  et, then this fu
24f80 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
24f90 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  p..** Otherwise,
24fa0 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71   the actions req
24fb0 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20  uired depend on 
24fc0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
24fd0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76   and the .** dev
24fe0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
24ff0 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66  ics of the the f
25000 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
25010 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
25020 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
25030 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
25040 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
25050 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
25060 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
25070 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
25080 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
25090 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
250a0 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
250b0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
250c0 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
250d0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
250e0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
250f0 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
25100 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
25110 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
25120 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
25130 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
25140 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
25150 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
25160 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
25170 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
25180 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
25190 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
251a0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
251b0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
251c0 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
251d0 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
251e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
251f0 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
25200 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
25210 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
25220 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
25230 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
25240 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
25250 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
25260 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
25270 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
25280 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
25290 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
252a0 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
252b0 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
252c0 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
252d0 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
252e0 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
252f0 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
25300 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
25310 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
25320 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
25330 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
25340 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
25350 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ful, this routin
25360 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48  e clears the PGH
25370 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
25380 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70  g of every .** p
25390 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65  age currently he
253a0 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66  ld in memory bef
253b0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
253c0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
253d0 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e  O.** error is en
253e0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
253f0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
25400 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
25410 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
25420 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
25430 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
25440 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72  ager, int newHdr
25450 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25470 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
25480 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
25490 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
254a0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
254b0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
254c0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
254d0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
254e0 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
254f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
25500 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
25510 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
25520 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
25530 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
25540 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
25550 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  eLock(pPager);. 
25560 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25570 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
25580 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
25590 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
255a0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
255b0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
255c0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
255d0 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
255e0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
255f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
25600 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
25610 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
25620 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
25630 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
25640 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
25650 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
25660 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
25670 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
25680 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
25690 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
256a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
256b0 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
256c0 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
256d0 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
256e0 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
256f0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
25700 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
25710 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
25720 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
25730 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
25740 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
25750 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25760 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
25770 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
25780 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
25790 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
257a0 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
257b0 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
257c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
257d0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
257e0 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
257f0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
25800 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
25810 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
25820 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
25830 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f  ion's transactio
25840 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
25850 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
25860 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
25870 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
25880 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
25890 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
258a0 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
258b0 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
258c0 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
258d0 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
258e0 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
258f0 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
25900 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
25910 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
25920 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
25930 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
25940 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
25950 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
25960 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
25970 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
25980 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
25990 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
259a0 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
259b0 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
259c0 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
259d0 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
259e0 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
259f0 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
25a00 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
25a10 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
25a20 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
25a30 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
25a40 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
25a50 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
25a60 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
25a70 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
25a80 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
25a90 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
25aa0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
25ab0 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
25ac0 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
25ad0 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
25ae0 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
25af0 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
25b00 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
25b10 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
25b20 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
25b30 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
25b40 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
25b50 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
25b60 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
25b70 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
25b80 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
25b90 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
25ba0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
25bb0 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
25bc0 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
25bd0 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
25be0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
25bf0 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
25c00 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
25c10 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
25c20 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  xtHdrOffset;.   
25c30 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
25c40 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48  ];.        u8 zH
25c50 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
25c60 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a  urnalMagic)+4];.
25c70 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
25c80 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
25c90 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
25ca0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
25cb0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
25cc0 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
25cd0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
25ce0 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
25cf0 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
25d00 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
25d10 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
25d20 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
25d30 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
25d40 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
25d50 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
25d60 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
25d70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25d80 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
25d90 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
25da0 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
25db0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
25dc0 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
25dd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
25de0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
25df0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
25e00 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
25e10 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
25e20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25e30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25e40 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
25e50 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
25e60 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
25e70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
25e80 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
25e90 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
25ea0 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
25eb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
25ec0 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
25ed0 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
25ee0 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
25ef0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
25f00 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
25f10 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
25f20 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
25f30 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
25f40 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
25f50 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
25f60 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
25f70 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
25f80 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
25f90 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
25fa0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
25fb0 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
25fc0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
25fd0 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
25fe0 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
25ff0 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
26000 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
26010 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
26020 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
26030 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
26040 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
26050 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
26060 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
26070 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
26080 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
26090 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
260a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
260b0 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
260c0 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
260d0 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
260e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
260f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
26100 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
26110 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
26120 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
26130 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
26140 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
26150 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
26160 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
26170 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
26180 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
26190 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
261a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
261b0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
261c0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
261d0 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
261e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
261f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
26200 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
26210 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
26220 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20  HDR %p %lld\n", 
26230 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
26240 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20  journalHdr));.  
26250 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26260 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20  e3OsWrite(.     
26270 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
26280 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
26290 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50  eof(zHeader), pP
262a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
262b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
262c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
262d0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
262e0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
262f0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
26300 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
26310 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
26320 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
26330 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
26340 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
26350 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
26360 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
26370 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
26380 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26390 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
263a0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
263b0 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20  syncFlags| .    
263c0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
263d0 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45  yncFlags==SQLITE
263e0 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
263f0 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
26400 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
26410 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26420 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
26430 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
26440 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
26450 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
26460 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
26470 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26     if( newHdr &&
26480 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
26490 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
264a0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  D) ){.        pP
264b0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
264c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
264d0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
264e0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
264f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26500 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26510 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
26520 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
26530 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
26540 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
26550 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
26560 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
26570 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64  is in noSync mod
26580 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
26590 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20  ile was just .  
265a0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
265b0 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77  synced. Either w
265c0 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ay, clear the PG
265d0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
265e0 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20  ag on .  ** all 
265f0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  pages..  */.  sq
26600 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
26610 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
26620 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50  ->pPCache);.  pP
26630 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
26640 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
26650 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  D;.  assert( ass
26660 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
26670 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
26680 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26690 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
266a0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
266b0 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
266c0 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
266d0 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
266e0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
266f0 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
26700 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
26710 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
26720 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
26730 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
26740 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
26750 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
26760 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
26770 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
26780 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
26790 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
267a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
267b0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
267c0 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
267d0 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
267e0 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
267f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
26800 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
26810 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
26820 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
26830 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
26840 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
26850 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
26860 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
26870 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
26880 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
26890 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
268a0 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
268b0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
268c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
268d0 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
268e0 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
268f0 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
26900 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
26910 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
26920 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
26930 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
26940 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
26950 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
26960 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
26970 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
26980 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
26990 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
269a0 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
269b0 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
269c0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
269d0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
269e0 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
269f0 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
26a00 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
26a10 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
26a20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
26a30 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
26a40 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
26a50 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
26a60 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
26a70 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
26a80 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
26a90 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
26aa0 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
26ab0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
26ac0 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
26ad0 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
26ae0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
26af0 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
26b00 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
26b10 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
26b20 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
26b30 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
26b40 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
26b50 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
26b60 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
26b70 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
26b80 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
26b90 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
26ba0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
26bb0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
26bc0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
26bd0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
26be0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
26bf0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
26c00 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
26c10 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
26c20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
26c30 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
26c40 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
26c50 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
26c60 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
26c70 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
26c80 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50  gelist(Pager *pP
26c90 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69  ager, PgHdr *pLi
26ca0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
26cb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26cd0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
26ce0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
26cf0 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
26d00 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61   for rollback pa
26d10 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44  gers in WRITER_D
26d20 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  BMOD state. */. 
26d30 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
26d40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
26d50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26d60 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
26d70 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b  _WRITER_DBMOD );
26d80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26d90 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
26da0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
26db0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
26dc0 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73   a temp-file has
26dd0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
26de0 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
26df0 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f  w. It.  ** is no
26e00 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  t possible for r
26e10 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68  c to be other th
26e20 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  an SQLITE_OK if 
26e30 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
26e40 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61   is taken, as pa
26e50 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
26e60 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
26e70 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20  r temp-files..  
26e80 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
26e90 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
26ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26eb0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
26ec0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
26ed0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
26ee0 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
26ef0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
26f00 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
26f10 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
26f20 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c  the first write,
26f30 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20   give the VFS a 
26f40 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65  hint of what the
26f50 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65   final.  ** file
26f60 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20   size will be.. 
26f70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63   */.  assert( rc
26f80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
26f90 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
26fa0 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ) );.  if( rc==S
26fb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
26fc0 65 72 2d 3e 64 62 53 69 7a 65 3e 70 50 61 67 65  er->dbSize>pPage
26fd0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 7b  r->dbHintSize ){
26fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
26ff0 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67  64 szFile = pPag
27000 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28  er->pageSize * (
27010 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50  sqlite3_int64)pP
27020 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
27030 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
27040 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
27050 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
27060 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69  SIZE_HINT, &szFi
27070 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  le);.    pPager-
27080 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
27090 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
270a0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
270b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
270c0 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
270d0 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
270e0 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
270f0 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
27100 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
27110 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
27120 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
27130 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
27140 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
27150 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
27160 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
27170 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
27180 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
27190 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
271a0 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
271b0 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
271c0 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
271d0 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
271e0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
271f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
27200 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
27210 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
27220 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
27230 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
27240 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
27250 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
27260 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
27270 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
27280 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
27290 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
272a0 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
272b0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
272c0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
272d0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
272e0 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
272f0 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
27300 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
27310 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27330 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
27340 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
27350 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
27360 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
27370 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
27380 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  0 );..      /* E
27390 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61  ncode the databa
273a0 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45  se */.      CODE
273b0 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  C2(pPager, pList
273c0 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36  ->pData, pgno, 6
273d0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
273e0 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a  NOMEM, pData);..
273f0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
27400 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
27410 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
27420 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
27430 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
27440 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
27450 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
27460 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
27470 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
27480 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
27490 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
274a0 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
274b0 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
274c0 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
274d0 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
274e0 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
274f0 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
27500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27510 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
27520 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
27530 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
27540 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
27550 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
27560 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
27570 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
27580 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
27590 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
275a0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
275b0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
275c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
275d0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
275e0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
275f0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
27600 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65   any backup obje
27610 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20  cts copying the 
27620 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
27630 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20   pager. */.     
27640 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
27650 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
27660 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
27670 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a  )pList->pData);.
27680 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
27690 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
276a0 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
276b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
276c0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
276d0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
276e0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
276f0 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
27700 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
27710 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
27720 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
27730 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
27740 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
27750 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
27760 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
27770 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Write);.    }els
27780 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
27790 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
277a0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
277b0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
277c0 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
277d0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
277e0 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  sh(pList);.    p
277f0 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
27800 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  irty;.  }..  ret
27810 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27820 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   Ensure that the
27830 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
27840 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74  e is open. If it
27850 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
27860 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
27870 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
27880 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
27890 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
278a0 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
278b0 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
278c0 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  . An .** SQLITE_
278d0 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
278e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
278f0 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   if a call to sq
27900 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a  lite3OsOpen() .*
27910 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * fails..*/.stat
27920 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
27930 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
27940 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
27950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
27960 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
27970 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  ->sjfd) ){.    i
27980 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
27990 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
279a0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
279b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
279c0 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
279d0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
279e0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
279f0 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
27a00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
27a10 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
27a20 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
27a30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
27a40 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
27a50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
27a70 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
27a80 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
27a90 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
27aa0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
27ab0 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  ** It is the cal
27ac0 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
27ad0 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52  ity to use subjR
27ae0 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f  equiresPage() to
27af0 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20   check .** that 
27b00 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71  it is really req
27b10 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c  uired before cal
27b20 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
27b30 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  on..**.** If suc
27b40 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
27b50 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
27b60 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20  ng to pPg->pgno 
27b70 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a  in the bitvecs.*
27b80 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73  * for all open s
27b90 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65  avepoints before
27ba0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
27bb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27bc0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
27bd0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
27be0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
27bf0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  n IO.** error co
27c00 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  de if the attemp
27c10 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
27c20 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61  e sub-journal fa
27c30 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49  ils, or .** SQLI
27c40 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
27c50 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65  lloc fails while
27c60 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69   setting a bit i
27c70 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  n a savepoint.**
27c80 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74   bitvec..*/.stat
27c90 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
27ca0 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  lPage(PgHdr *pPg
27cb0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
27cc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
27cd0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
27ce0 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
27cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
27d00 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
27d10 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20  MODE_OFF ){..   
27d20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
27d30 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
27d40 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
27d50 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  been opened */. 
27d60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27d70 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
27d80 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
27d90 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27da0 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28   || pagerUseWal(
27db0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61  pPager) );.    a
27dc0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
27dd0 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70  ager->sjfd) || p
27de0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d  Pager->nSubRec==
27df0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
27e00 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
27e10 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ger) .         |
27e20 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  | pageInJournal(
27e30 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
27e40 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
27e50 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
27e60 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
27e70 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
27e80 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
27e90 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
27ea0 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
27eb0 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
27ec0 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
27ed0 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
27ee0 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
27ef0 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
27f00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
27f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27f20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
27f30 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
27f40 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
27f50 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
27f60 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
27f70 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61  Size);.      cha
27f80 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20  r *pData2;.  .  
27f90 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
27fa0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
27fb0 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
27fc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
27fd0 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45  ta2);.      PAGE
27fe0 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f  RTRACE(("STMT-JO
27ff0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
28000 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
28010 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
28020 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
28030 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
28040 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
28050 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
28060 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28070 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
28080 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
28090 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
280a0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
280b0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
280c0 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+4);.      }.  
280d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
280e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
280f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52     pPager->nSubR
28100 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ec++;.    assert
28110 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
28120 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63  oint>0 );.    rc
28130 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   = addToSavepoin
28140 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
28150 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
28160 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28170 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
28180 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
28190 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
281a0 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
281b0 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
281c0 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
281d0 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
281e0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
281f0 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
28200 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
28210 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
28220 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
28230 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
28240 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
28250 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
28260 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
28270 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
28280 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
28290 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
282a0 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
282b0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
282c0 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
282d0 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
282e0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
282f0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
28300 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
28310 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
28320 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
28330 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
28340 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
28350 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
28360 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
28370 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
28380 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
28390 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
283a0 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
283b0 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
283c0 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
283d0 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
283e0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
283f0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
28400 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
28410 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
28420 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
28430 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
28440 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
28450 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
28460 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
28470 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
28480 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
28490 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
284a0 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
284b0 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
284c0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
284d0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
284e0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
284f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
28500 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
28510 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
28520 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
28530 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
28540 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
28550 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
28560 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
28570 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
28580 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
28590 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
285a0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
285b0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
285c0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e  );..  /* The doN
285d0 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67  otSyncSpill flag
285e0 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74   is set during t
285f0 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20  imes when doing 
28600 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a  a sync of.  ** j
28610 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69  ournal (and addi
28620 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29  ng a new header)
28630 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e   is not allowed.
28640 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20    This occurs.  
28650 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20  ** during calls 
28660 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
28670 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79  rite() while try
28680 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d  ing to journal m
28690 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67  ultiple.  ** pag
286a0 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  es belonging to 
286b0 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e  the same sector.
286c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
286d0 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20 69  oNotSpill flag i
286e0 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68  nhibits all cach
286f0 65 20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61 72  e spilling regar
28700 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
28710 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73  .  ** or not a s
28720 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e  ync is required.
28730 20 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75    This is set du
28740 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
28750 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
28760 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
28770 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
28780 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
28790 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
287a0 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
287b0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
287c0 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
287d0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20  t implementaton 
287e0 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f  it .  ** is impo
287f0 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  ssible for sqlit
28800 65 33 50 43 61 63 68 65 46 65 74 63 68 28 29 20  e3PCacheFetch() 
28810 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  to be called wit
28820 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a  h createFlag==1.
28830 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68    ** while in th
28840 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68  e error state, h
28850 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ence it is impos
28860 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
28870 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62  outine to.  ** b
28880 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  e called in the 
28890 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65  error state.  Ne
288a0 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69  vertheless, we i
288b0 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29  nclude a NEVER()
288c0 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74  .  ** test for t
288d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
288e0 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67  s a safeguard ag
288f0 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61  ainst future cha
28900 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nges..  */.  if(
28910 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
28920 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
28930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
28940 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
28950 70 69 6c 6c 20 29 20 72 65 74 75 72 6e 20 53 51  pill ) return SQ
28960 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
28970 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
28980 53 70 69 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66  Spill && (pPg->f
28990 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
289a0 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20  D_SYNC)!=0 ){.  
289b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
289c0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e  OK;.  }..  pPg->
289d0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66  pDirty = 0;.  if
289e0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
289f0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
28a00 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66  Write a single f
28a10 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61  rame for this pa
28a20 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a  ge to the log. *
28a30 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
28a40 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
28a50 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ){ .      rc = s
28a60 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
28a70 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69  g); .    }.    i
28a80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28a90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
28aa0 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
28ab0 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 2c  ager, pPg, 0, 0,
28ac0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
28ad0 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79  se{.  .    /* Sy
28ae0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
28af0 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
28b00 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d   */.    if( pPg-
28b10 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
28b20 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20  D_SYNC .     || 
28b30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
28b40 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
28b50 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20  HEMOD.    ){.   
28b60 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
28b70 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  nal(pPager, 1);.
28b80 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
28b90 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
28ba0 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  er of this page 
28bb0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
28bc0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
28bd0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  of.    ** the da
28be0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74  tabase image, it
28bf0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
28c00 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
28c10 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ub-journal..    
28c20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
28c30 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70  se the call to p
28c40 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
28c50 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c  ist() below will
28c60 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75   not.    ** actu
28c70 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20  ally write data 
28c80 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  to the file in t
28c90 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a  his case..    **
28ca0 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72  .    ** Consider
28cb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
28cc0 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74  equence of event
28cd0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
28ce0 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a     BEGIN;.    **
28cf0 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
28d00 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
28d10 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e   <modify page X>
28d20 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45  .    **     SAVE
28d30 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a  POINT sp;.    **
28d40 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64         <shrink d
28d50 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
28d60 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20  Y pages>.    ** 
28d70 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73        pagerStres
28d80 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a  s(page X).    **
28d90 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
28da0 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20   sp;.    **.    
28db0 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
28dc0 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
28dd0 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
28de0 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
28df0 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f  written.    ** o
28e00 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
28e10 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c  se file, but wil
28e20 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  l be dropped fro
28e30 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65  m the cache. The
28e40 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  n,.    ** follow
28e50 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  ing the "ROLLBAC
28e60 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65  K TO sp" stateme
28e70 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65  nt, reading page
28e80 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20   X will read.   
28e90 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
28ea0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
28eb0 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
28ec0 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58  e copy of page X
28ed0 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61   as it.    ** wa
28ee0 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  s when the trans
28ef0 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
28f00 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68  not as it was wh
28f10 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70  en "SAVEPOINT sp
28f20 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65  ".    ** was exe
28f30 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  cuted..    **.  
28f40 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
28f50 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68  n is to write th
28f60 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66  e current data f
28f70 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74  or page X into t
28f80 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a  he .    ** sub-j
28f90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
28fa0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
28fb0 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
28fc0 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
28fd0 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64    ** be restored
28fe0 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20   to its current 
28ff0 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22  value when the "
29000 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
29010 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75  is .    ** execu
29020 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
29030 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20  if( NEVER(.     
29040 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
29050 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   && pPg->pgno>pP
29060 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
29070 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
29080 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20  (pPg).    ) ){. 
29090 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
290a0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
290b0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
290c0 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
290d0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75  s of the page ou
290e0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
290f0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
29100 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29110 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
29120 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
29130 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
29140 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
29150 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
29160 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67  list(pPager, pPg
29170 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
29180 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
29190 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20   as clean. */.  
291a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
291b0 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  K ){.    PAGERTR
291c0 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20  ACE(("STRESS %d 
291d0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
291e0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
291f0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71  ->pgno));.    sq
29200 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
29210 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  lean(pPg);.  }..
29220 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
29230 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
29240 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ; .}.../*.** All
29250 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
29260 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72  lize a new Pager
29270 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20   object and put 
29280 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a  a pointer to it.
29290 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20  ** in *ppPager. 
292a0 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  The pager should
292b0 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66   eventually be f
292c0 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20  reed by passing 
292d0 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  it.** to sqlite3
292e0 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a  PagerClose()..**
292f0 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
29300 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
29310 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
29320 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
29330 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  pen..** If zFile
29340 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
29350 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
29360 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
29370 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
29380 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
29390 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
293a0 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c  d. Temporary fil
293b0 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65  es are be delete
293c0 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
293d0 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ly when they are
293e0 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c   closed. If zFil
293f0 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
29400 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c  y:" then .** all
29410 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
29420 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49  held in cache. I
29430 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
29440 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20  en to disk. .** 
29450 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
29460 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
29470 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
29480 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ase..**.** The n
29490 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20  Extra parameter 
294a0 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
294b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
294c0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
294d0 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65  .** along with e
294e0 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e  ach page referen
294f0 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69  ce. This space i
29500 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  s available to t
29510 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74  he user.** via t
29520 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
29530 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a  etExtra() API..*
29540 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
29550 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
29560 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
29570 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
29580 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
29590 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
295a0 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
295b0 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
295c0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
295d0 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d   of the PAGER_OM
295e0 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50  IT_JOURNAL and P
295f0 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
29600 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
29610 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
29620 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
29630 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
29640 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
29650 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
29660 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
29670 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
29680 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
29690 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
296a0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
296b0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
296c0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
296d0 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
296e0 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
296f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
29700 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
29710 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
29720 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
29730 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
29740 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
29750 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
29760 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
29770 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
29780 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
29790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
297a0 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
297b0 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
297c0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
297d0 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
297e0 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
297f0 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
29800 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
29810 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
29820 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
29830 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
29840 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
29850 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
29860 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
29870 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
29880 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
29890 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
298a0 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
298b0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
298c0 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
298d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
298e0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
298f0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
29900 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
29910 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
29920 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
29930 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
29940 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
29950 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
29960 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
29970 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
29980 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
29990 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
299a0 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
299b0 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
299c0 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
299d0 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
299e0 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
299f0 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
29a00 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
29a10 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
29a20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
29a30 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
29a40 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
29a50 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
29a60 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
29a70 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
29a80 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
29a90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
29aa0 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
29ab0 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
29ac0 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
29ad0 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
29ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
29af0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
29b00 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
29b10 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
29b20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
29b30 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
29b40 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
29b50 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
29b60 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
29b70 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
29b80 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
29b90 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
29ba0 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
29bb0 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
29bc0 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
29bd0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
29be0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
29bf0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
29c00 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
29c10 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
29c20 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
29c30 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
29c40 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
29c50 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
29c60 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61  l */.  int noRea
29c70 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
29c80 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
29c90 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65  CK)!=0;  /* True
29ca0 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f   to omit read-lo
29cb0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  ck */.  int pcac
29cc0 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  heSize = sqlite3
29cd0 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20  PcacheSize();   
29ce0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
29cf0 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61  allocate for PCa
29d00 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50  che */.  u32 szP
29d10 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
29d20 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
29d30 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ZE;  /* Default 
29d40 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  page size */..  
29d50 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
29d60 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
29d70 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
29d80 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
29d90 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
29da0 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
29db0 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
29dc0 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
29dd0 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
29de0 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
29df0 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
29e00 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
29e10 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
29e20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
29e30 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
29e40 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
29e50 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
29e60 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
29e70 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
29e80 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
29e90 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
29ea0 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
29eb0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
29ec0 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
29ed0 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
29ee0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
29ef0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
29f00 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
29f10 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
29f20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
29f30 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
29f40 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
29f50 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
29f60 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
29f70 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
29f80 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
29f90 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
29fa0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
29fb0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
29fc0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
29fd0 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
29fe0 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
29ff0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
2a000 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
2a010 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
2a020 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23  *ppPager = 0;..#
2a030 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a040 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66  IT_MEMORYDB.  if
2a050 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ( flags & PAGER_
2a060 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65  MEMORY ){.    me
2a070 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 46 69  mDb = 1;.    zFi
2a080 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
2a090 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
2a0a0 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74  pute and store t
2a0b0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
2a0c0 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64   in an allocated
2a0d0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
2a0e0 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68    ** to by zPath
2a0f0 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61  name, length nPa
2a100 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74  thname. Or, if t
2a110 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
2a120 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65  ry file,.  ** le
2a130 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61  ave both nPathna
2a140 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65  me and zPathname
2a150 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a   set to 0..  */.
2a160 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2a170 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2a180 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  ){.    nPathname
2a190 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
2a1a0 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68  ame+1;.    zPath
2a1b0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
2a1c0 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32  lloc(nPathname*2
2a1d0 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
2a1e0 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
2a1f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2a200 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
2a210 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
2a220 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  ; /* Make sure i
2a230 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20  nitialized even 
2a240 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  if FullPathname(
2a250 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  ) fails */.    r
2a260 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
2a270 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
2a280 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
2a290 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
2a2a0 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2a2b0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2a2c0 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
2a2d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a2e0 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
2a2f0 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
2a300 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
2a310 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2a320 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
2a330 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
2a340 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2a350 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
2a360 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
2a370 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
2a380 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
2a390 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
2a3a0 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
2a3b0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2a3c0 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
2a3d0 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
2a3e0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
2a3f0 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
2a400 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2a410 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
2a420 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
2a430 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
2a440 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
2a450 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a460 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2a470 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2a480 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a490 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2a4a0 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
2a4b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2a4c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2a4d0 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2a4e0 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2a4f0 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2a500 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2a510 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2a520 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2a530 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2a540 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2a550 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2a560 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2a570 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2a580 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2a590 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5b0 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2a5c0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2a5d0 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5f0 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2a600 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2a610 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2a620 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2a630 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2a640 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2a650 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2a660 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2a670 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2a680 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2a690 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2a6a0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2a6b0 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2a6c0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2a6d0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2a6e0 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2a6f0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2a700 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2a710 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2a720 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2a730 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2a740 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2a750 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2a760 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2a770 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2a780 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2a790 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2a7a0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2a7b0 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2a7c0 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2a7d0 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2a7e0 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2a7f0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2a800 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2a810 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2a820 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2a830 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2a840 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2a850 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2a860 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a880 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2a890 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2a8a0 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20  8 + 1           
2a8b0 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2a8c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2a8d0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2a8e0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2a8f0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1              /
2a900 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66  * zWal */.#endif
2a910 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
2a920 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2a930 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
2a940 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
2a950 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
2a960 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
2a970 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
2a980 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
2a990 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2a9a0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
2a9c0 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
2a9d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
2a9e0 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
2a9f0 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
2aa00 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
2aa10 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
2aa20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2aa30 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2aa40 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
2aa50 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
2aa60 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2aa70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
2aa80 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
2aa90 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
2aaa0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2aab0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2aac0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
2aad0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
2aae0 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
2aaf0 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2ab00 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
2ab10 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2ab20 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
2ab30 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
2ab40 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
2ab50 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
2ab60 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
2ab70 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
2ab80 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
2ab90 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
2aba0 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b  ( nPathname>0 );
2abb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
2abc0 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
2abd0 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
2abe0 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65  ame + 1);.    me
2abf0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
2ac00 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
2ac10 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2ac20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2ac30 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2ac40 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2ac50 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2ac60 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2ac70 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2ac80 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 23 69 66 6e  urnal", 8);.#ifn
2ac90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2aca0 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  WAL.    pPager->
2acb0 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  zWal = &pPager->
2acc0 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2acd0 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  me+8+1];.    mem
2ace0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2acf0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2ad00 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2ad10 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61  cpy(&pPager->zWa
2ad20 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2ad30 77 61 6c 22 2c 20 34 29 3b 0a 23 65 6e 64 69 66  wal", 4);.#endif
2ad40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2ad50 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
2ad60 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  }.  pPager->pVfs
2ad70 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65   = pVfs;.  pPage
2ad80 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
2ad90 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70  sFlags;..  /* Op
2ada0 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
2adb0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  e..  */.  if( zF
2adc0 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2add0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
2ade0 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
2adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae00 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
2ae10 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
2ae20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2ae30 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2ae40 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2ae50 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
2ae60 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
2ae70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d  ;.    assert( !m
2ae80 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64  emDb );.    read
2ae90 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
2aea0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2aeb0 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  Y);..    /* If t
2aec0 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
2aed0 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
2aee0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2aef0 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68  ccess,.    ** ch
2af00 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
2af10 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
2af20 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
2af30 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
2af40 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2af50 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2af60 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
2af70 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  m of:.    **.   
2af80 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f   **    + SQLITE_
2af90 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2afa0 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  E,.    **    + T
2afb0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
2afc0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
2afd0 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
2afe0 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
2aff0 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
2b000 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
2b010 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
2b020 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2b030 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65  SQLITE_OK && !re
2b040 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
2b050 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2b060 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
2b070 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
2b080 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
2b090 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2b0a0 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
2b0b0 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c     if( szPageDfl
2b0c0 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  t<pPager->sector
2b0d0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2b0e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
2b0f0 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
2b100 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2b110 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
2b120 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2b130 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2b140 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
2b150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b160 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2b170 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73  = (u32)pPager->s
2b180 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
2b190 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
2b1a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2b1b0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2b1c0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69       {.        i
2b1d0 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
2b1e0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2b1f0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2b200 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  fd);.        int
2b210 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
2b220 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2b230 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
2b240 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
2b250 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2b260 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
2b270 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
2b280 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2b290 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2b2a0 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
2b2b0 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73          for(ii=s
2b2c0 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53  zPageDflt; ii<=S
2b2d0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2b2e0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
2b2f0 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
2b300 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
2b310 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
2b320 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
2b330 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2b340 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
2b350 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2b360 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2b370 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
2b380 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79  * If a temporary
2b390 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74   file is request
2b3a0 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70  ed, it is not op
2b3b0 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ened immediately
2b3c0 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
2b3d0 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20   case we accept 
2b3e0 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
2b3f0 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20   size and delay 
2b400 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
2b410 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  opening the file
2b420 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
2b430 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65   call to OsWrite
2b440 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
2b450 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2b460 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e   also run for an
2b470 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2b480 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72  ase. An in-memor
2b490 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  y.    ** databas
2b4a0 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
2b4b0 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61   a temp-file tha
2b4c0 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
2b4d0 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a  en out to.    **
2b4e0 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61   disk and uses a
2b4f0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c  n in-memory roll
2b500 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  back journal..  
2b510 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69    */ .    tempFi
2b520 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
2b530 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2b540 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
2b550 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45  Pager->eLock = E
2b560 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
2b570 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
2b580 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
2b590 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
2b5a0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
2b5b0 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
2b5c0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2b5d0 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
2b5e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
2b5f0 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
2b600 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
2b610 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
2b620 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
2b630 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2b640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2b650 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
2b660 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
2b670 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
2b680 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
2b690 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
2b6a0 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
2b6b0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
2b6c0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
2b6d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2b6e0 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
2b6f0 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
2b700 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a  , free the .  **
2b710 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2b720 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
2b730 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2b740 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b750 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
2b760 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
2b770 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
2b780 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
2b790 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2b7a0 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
2b7b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2b7c0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2b7d0 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
2b7e0 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ct. */.  assert(
2b7f0 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
2b800 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
2b810 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c  8(nExtra);.  sql
2b820 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
2b830 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
2b840 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
2b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
2b860 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
2b870 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
2b880 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
2b890 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54  ache);..  PAGERT
2b8a0 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
2b8b0 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
2b8c0 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
2b8d0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2b8e0 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
2b8f0 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
2b900 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2b910 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
2b920 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2b930 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
2b940 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  al;.  pPager->no
2b950 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65  Readlock = (noRe
2b960 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
2b970 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70  ly) ?1:0;.  /* p
2b980 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
2b990 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2b9a0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
2b9b0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2b9c0 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
2b9d0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2b9e0 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
2b9f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2ba00 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
2ba10 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
2ba20 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2ba30 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
2ba40 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
2ba50 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
2ba60 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
2ba70 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20  LOCK; */.#if 0. 
2ba80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ba90 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46  >state == (tempF
2baa0 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c  ile ? PAGER_EXCL
2bab0 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e  USIVE : PAGER_UN
2bac0 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a  LOCK) );.#endif.
2bad0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
2bae0 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
2baf0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2bb00 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a  = (u8)tempFile;.
2bb10 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
2bb20 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2bb30 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
2bb40 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
2bb50 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2bb60 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2bb70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2bb80 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2bb90 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
2bba0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
2bbb0 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65  iveMode = (u8)te
2bbc0 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
2bbd0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2bbe0 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
2bbf0 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
2bc00 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d  >memDb = (u8)mem
2bc10 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
2bc20 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61  adOnly = (u8)rea
2bc30 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28  dOnly;.  assert(
2bc40 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70   useJournal || p
2bc50 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2bc60 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
2bc70 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
2bc80 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
2bc90 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61  ->fullSync = pPa
2bca0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31  ger->noSync ?0:1
2bcb0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
2bcc0 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e  Flags = pPager->
2bcd0 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 53 51 4c  noSync ? 0 : SQL
2bce0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
2bcf0 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  .  pPager->ckptS
2bd00 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65  yncFlags = pPage
2bd10 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20  r->syncFlags;.  
2bd20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2bd30 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
2bd40 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
2bd50 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
2bd60 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
2bd70 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2bd80 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
2bd90 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
2bda0 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
2bdb0 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2bdc0 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
2bdd0 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
2bde0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2bdf0 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
2be00 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
2be10 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
2be20 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
2be30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2be40 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2be50 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2be60 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
2be70 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
2be80 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2be90 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2bea0 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
2beb0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
2bec0 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
2bed0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
2bee0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
2bef0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2bf00 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
2bf10 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  nit;.  /* memset
2bf20 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
2bf30 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
2bf40 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20  ->aHash)); */.. 
2bf50 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
2bf60 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
2bf70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ITE_OK;.}..../*.
2bf80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2bf90 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
2bfa0 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
2bfb0 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rom PAGER_UNLOCK
2bfc0 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41   to.** PAGER_SHA
2bfd0 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65  RED state. It te
2bfe0 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20  sts if there is 
2bff0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72  a hot journal pr
2c000 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
2c010 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
2c020 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
2c030 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
2c040 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e  s one that .** n
2c050 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
2c060 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e  d back. Accordin
2c070 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  g to this functi
2c080 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  on, a hot-journa
2c090 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73  l.** file exists
2c0a0 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
2c0b0 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  g criteria are m
2c0c0 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
2c0d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2c0e0 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
2c0f0 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
2c100 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
2c110 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2c120 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2c130 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2c140 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
2c150 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
2c160 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
2c170 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
2c180 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a  es in size, and.
2c190 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74  **   * The first
2c1a0 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75   byte of the jou
2c1b0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2c1c0 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30   and is not 0x00
2c1d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
2c1e0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
2c1f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c200 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
2c210 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
2c220 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
2c230 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
2c240 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
2c250 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
2c260 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
2c270 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68  same name. In th
2c280 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
2c290 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a  nal file is.** j
2c2a0 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e  ust deleted usin
2c2b0 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78  g OsDelete, *pEx
2c2c0 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30  ists is set to 0
2c2d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
2c2e0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
2c2f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2c300 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b  e does not check
2c310 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d   if there is a m
2c320 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2c330 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65  lename.** at the
2c340 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
2c350 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61  . If there is, a
2c360 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a  nd that master j
2c370 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64  ournal file.** d
2c380 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
2c390 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2c3a0 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2c3b0 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a  ly hot. In this.
2c3c0 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ** case this rou
2c3d0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
2c3e0 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
2c3f0 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  e. The pager_pla
2c400 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  yback().** routi
2c410 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
2c420 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2c430 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2c440 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a  ally hot and .**
2c450 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69   will not roll i
2c460 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  t back. .**.** I
2c470 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
2c480 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f  file is found to
2c490 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73   exist, *pExists
2c4a0 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64   is set to 1 and
2c4b0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72   .** SQLITE_OK r
2c4c0 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68  eturned. If no h
2c4d0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2c4e0 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78  is present, *pEx
2c4f0 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74  ists is.** set t
2c500 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
2c510 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
2c520 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2c530 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  s while trying.*
2c540 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  * to determine w
2c550 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
2c560 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2c570 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20   exists, the IO 
2c580 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
2c590 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2c5a0 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69  e value of *pExi
2c5b0 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64  sts is undefined
2c5c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c5d0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
2c5e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2c5f0 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
2c600 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
2c610 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
2c620 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20  >pVfs;.  int rc 
2c630 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2c640 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2c650 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   code */.  int e
2c660 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20  xists = 1;      
2c670 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2c680 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   if a journal fi
2c690 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  le is present */
2c6a0 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20  .  int jrnlOpen 
2c6b0 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65  = !!isOpen(pPage
2c6c0 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65  r->jfd);..  asse
2c6d0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2c6e0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
2c6f0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2c700 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65  r->fd) );.  asse
2c710 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2c720 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
2c730 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e  ;..  assert( jrn
2c740 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71  lOpen==0 || ( sq
2c750 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
2c760 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
2c770 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20  ger->jfd) &.    
2c780 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
2c790 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
2c7a0 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78  EN.  ));..  *pEx
2c7b0 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  ists = 0;.  if( 
2c7c0 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2c7d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
2c7e0 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
2c7f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
2c800 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2c810 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
2c820 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2c830 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
2c840 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65  ){.    int locke
2c850 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
2c860 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
2c870 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
2c880 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2c890 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65   */..    /* Race
2c8a0 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a   condition here:
2c8b0 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73    Another proces
2c8c0 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  s might have bee
2c8d0 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  n holding the.  
2c8e0 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45    ** the RESERVE
2c8f0 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20  D lock and have 
2c900 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61  a journal open a
2c910 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41  t the sqlite3OsA
2c920 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20  ccess() .    ** 
2c930 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20  call above, but 
2c940 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
2c950 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70  journal and drop
2c960 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65   the lock before
2c970 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74  .    ** we get t
2c980 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2c990 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
2c9a0 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c  servedLock() cal
2c9b0 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20  l.  If that.    
2c9c0 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  ** is the case, 
2c9d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
2c9e0 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69  ht think there i
2c9f0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2ca00 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66  when.    ** in f
2ca10 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e  act there is non
2ca20 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73  e.  This results
2ca30 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69   in a false-posi
2ca40 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a  tive which will.
2ca50 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
2ca60 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79  with by the play
2ca70 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54  back routine.  T
2ca80 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20  icket #3883..   
2ca90 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2caa0 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
2cab0 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
2cac0 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
2cad0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cae0 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
2caf0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  {.      Pgno nPa
2cb00 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2cb10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2cb20 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
2cb30 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
2cb40 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73    /* Check the s
2cb50 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2cb60 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20  ase file. If it 
2cb70 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61  consists of 0 pa
2cb80 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ges,.      ** th
2cb90 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2cba0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20  urnal file. See 
2cbb0 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
2cbc0 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20  nt above for .  
2cbd0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f      ** the reaso
2cbe0 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65  ning here.  Dele
2cbf0 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20  te the obsolete 
2cc00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64  journal file und
2cc10 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45  er.      ** a RE
2cc20 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
2cc30 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74  void race condit
2cc40 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69  ions and to avoi
2cc50 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20  d violating.    
2cc60 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20    ** [H33020].. 
2cc70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2cc80 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
2cc90 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
2cca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2ccb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ccc0 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
2ccd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2cce0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
2ccf0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
2cd00 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c        if( pagerL
2cd10 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45  ockDb(pPager, RE
2cd20 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51  SERVED_LOCK)==SQ
2cd30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cd40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
2cd50 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
2cd60 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
2cd70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2cd80 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
2cd90 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65  usiveMode ) page
2cda0 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
2cdb0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
2cdc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cdd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
2cde0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
2cdf0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ce00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ce10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2ce20 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  sts and no other
2ce30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
2ce40 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20  a reserved.     
2ce50 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74       ** or great
2ce60 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
2ce70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f  atabase file. No
2ce80 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
2ce90 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
2cea0 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
2ceb0 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61  non-zero bytes a
2cec0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
2ced0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2cee0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
2cef0 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20   there is, then 
2cf00 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73  we consider this
2cf10 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68   journal to be h
2cf20 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20  ot. If not, .   
2cf30 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
2cf40 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20   be ignored..   
2cf50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2cf60 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
2cf70 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2cf80 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
2cf90 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
2cfa0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2cfb0 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
2cfc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cfd0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2cfe0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
2cff0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
2d000 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  f);.          }.
2d010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2d020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d030 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69             u8 fi
2d040 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rst = 0;.       
2d050 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d060 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
2d070 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69  jfd, (void *)&fi
2d080 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  rst, 1, 0);.    
2d090 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2d0a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
2d0b0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
2d0c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2d0d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2d0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d0f0 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e     if( !jrnlOpen
2d100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d110 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
2d120 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
2d130 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2d140 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
2d150 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a  s = (first!=0);.
2d160 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
2d170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
2d180 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
2d190 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
2d1a0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20  cannot open the 
2d1b0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2d1c0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
2d1d0 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20  o see if.       
2d1e0 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20       ** its has 
2d1f0 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74  a zero header, t
2d200 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65  hat might be due
2d210 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72   to an I/O error
2d220 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20  , or.           
2d230 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
2d240 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20  due to the race 
2d250 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
2d260 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e  bed above and in
2d270 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2d280 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45  ticket #3883.  E
2d290 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d  ither way, assum
2d2a0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
2d2b0 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20  al is hot..     
2d2c0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d         ** This m
2d2d0 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20  ight be a false 
2d2e0 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69  positive.  But i
2d2f0 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
2d300 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
2d310 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e   automatic journ
2d320 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20  al playback and 
2d330 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69  recovery mechani
2d340 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20  sm will deal.   
2d350 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68           ** with
2d360 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43   it under an EXC
2d370 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72  LUSIVE lock wher
2d380 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  e we do not need
2d390 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20   to.            
2d3a0 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68  ** worry so much
2d3b0 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69   with race condi
2d3c0 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20  tions..         
2d3d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2d3e0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
2d3f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2d400 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2d410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d420 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2d430 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2d440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2d450 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2d460 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ed to obtain a s
2d470 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
2d480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2d490 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
2d4a0 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  l to call sqlite
2d4b0 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20  3PagerAcquire() 
2d4c0 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73  until after this
2d4d0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
2d4e0 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2d4f0 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20  ly called. If a 
2d500 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61  shared-lock is a
2d510 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e  lready held when
2d520 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
2d530 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
2d540 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
2d550 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2d560 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61  operations are a
2d570 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79  lso performed by
2d580 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2d590 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68  **.**   1) If th
2d5a0 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65  e pager is curre
2d5b0 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50  ntly in PAGER_OP
2d5c0 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63  EN state (no loc
2d5d0 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f  k held.**      o
2d5e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2d5f0 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74  ile), then an at
2d600 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2d610 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20   obtain a.**    
2d620 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e    SHARED lock on
2d630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d640 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  le. Immediately 
2d650 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a  after obtaining.
2d660 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52  **      the SHAR
2d670 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c  ED lock, the fil
2d680 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63  e-system is chec
2d690 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ked for a hot-jo
2d6a0 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77  urnal,.**      w
2d6b0 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62  hich is played b
2d6c0 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20  ack if present. 
2d6d0 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f  Following any ho
2d6e0 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20  t-journal .**   
2d6f0 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65     rollback, the
2d700 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d710 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64   cache are valid
2d720 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67  ated by checking
2d730 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68  .**      the 'ch
2d740 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69  ange-counter' fi
2d750 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  eld of the datab
2d760 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20  ase file header 
2d770 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63  and.**      disc
2d780 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72  arded if they ar
2d790 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e  e found to be in
2d7a0 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  valid..**.**   2
2d7b0 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
2d7c0 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
2d7d0 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64  lusive-mode, and
2d7e0 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
2d7f0 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20  ntly.**      no 
2d800 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
2d810 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61  rences to any pa
2d820 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74  ges, and is in t
2d830 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a  he error state,.
2d840 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20  **      then an 
2d850 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
2d860 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  to clear the err
2d870 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63  or state by disc
2d880 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  arding.**      t
2d890 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2d8a0 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  he page cache an
2d8b0 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  d rolling back a
2d8c0 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a  ny open journal.
2d8d0 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a  **      file..**
2d8e0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
2d8f0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
2d900 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2d910 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2d920 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
2d930 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  s while locking 
2d940 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68  the database, ch
2d950 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74  ecking for a hot
2d960 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  -journal file or
2d970 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63   .** rolling bac
2d980 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
2d990 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
2d9a0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2d9b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2d9c0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
2d9d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2d9e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d9f0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2da00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2da10 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
2da20 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
2da30 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74   called from b-t
2da40 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65  ree and only whe
2da50 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  n there are no. 
2da60 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   ** outstanding 
2da70 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c  pages. This impl
2da80 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ies that the pag
2da90 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20  er state should 
2daa0 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f  either.  ** be O
2dab0 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52  PEN or READER. R
2dac0 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f  EADER is only po
2dad0 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70 61  ssible if the pa
2dae0 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e  ger is or was in
2daf0 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65   .  ** exclusive
2db00 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20   access mode..  
2db10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
2db20 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
2db30 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2db40 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  he)==0 );.  asse
2db50 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
2db60 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
2db70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2db80 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2db90 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
2dba0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2dbb0 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20  READER );.  if( 
2dbc0 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70  NEVER(MEMDB && p
2dbd0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
2dbe0 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  ){ return pPager
2dbf0 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20  ->errCode; }..  
2dc00 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
2dc10 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
2dc20 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2dc30 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e  R_OPEN ){.    in
2dc40 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20  t bHotJournal = 
2dc50 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  1;          /* T
2dc60 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69  rue if there exi
2dc70 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  sts a hot journa
2dc80 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61  l-file */..    a
2dc90 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
2dca0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2dcb0 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d  ger->noReadlock=
2dcc0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 72 65  =0 || pPager->re
2dcd0 61 64 4f 6e 6c 79 20 29 3b 0a 0a 20 20 20 20 69  adOnly );..    i
2dce0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  f( pPager->noRea
2dcf0 64 6c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  dlock==0 ){.    
2dd00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
2dd10 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
2dd20 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
2dd30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2dd40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dd50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2dd60 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
2dd70 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  K || pPager->eLo
2dd80 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
2dd90 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   );.        goto
2dda0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
2ddb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2ddc0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
2ddd0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
2dde0 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
2ddf0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
2de00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2de10 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
2de20 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
2de30 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
2de40 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
2de50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
2de60 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
2de70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68   ){.      rc = h
2de80 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
2de90 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61  ger, &bHotJourna
2dea0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
2deb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2dec0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61  ){.      goto fa
2ded0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
2dee0 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  if( bHotJournal 
2def0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ){.      /* Get 
2df00 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2df10 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2df20 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
2df30 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
2df40 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
2df50 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
2df60 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
2df70 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
2df80 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45  o the.      ** E
2df90 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
2dfa0 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
2dfb0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
2dfc0 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
2dfd0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2dfe0 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
2dff0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
2e000 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
2e010 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
2e020 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
2e030 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
2e040 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
2e050 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20  rolling the .   
2e060 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
2e070 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  l back..      **
2e080 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75   .      ** Becau
2e090 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
2e0a0 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
2e0b0 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
2e0c0 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  ed, any.      **
2e0d0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
2e0e0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63  ttempting to acc
2e0f0 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
2e100 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74   file will get t
2e110 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
2e120 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
2e130 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f  de and fail to o
2e140 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
2e150 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20  CLUSIVE lock .  
2e160 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61      ** on the da
2e170 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
2e180 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
2e190 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
2e1a0 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  is in locking_mo
2e1b0 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
2e1c0 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20  e, the lock is. 
2e1d0 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64       ** downgrad
2e1e0 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43  ed to SHARED_LOC
2e1f0 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  K before this fu
2e200 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
2e210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2e220 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
2e230 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
2e240 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  E_LOCK);.      i
2e250 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e260 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
2e270 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
2e280 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  . .      /* If i
2e290 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
2e2a0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69   open and the fi
2e2b0 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  le exists on dis
2e2c0 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20  k, open the .   
2e2d0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f     ** journal fo
2e2e0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2e2f0 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73  ess. Write acces
2e300 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
2e310 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  cause .      ** 
2e320 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
2e330 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
2e340 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
2e350 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a  l be kept open .
2e360 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73        ** and pos
2e370 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
2e380 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
2e390 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69  er on. Also, wri
2e3a0 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20  te-access .     
2e3b0 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72   ** is usually r
2e3c0 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c  equired to final
2e3d0 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
2e3e0 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  in journal_mode=
2e3f0 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a  persist .      *
2e400 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f  * mode (and also
2e410 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   for journal_mod
2e420 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f  e=truncate on so
2e430 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20  me systems)..   
2e440 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
2e450 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
2e460 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
2e470 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
2e480 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
2e490 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
2e4a0 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  ion managed to g
2e4b0 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69  et in and roll i
2e4c0 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20  t back before . 
2e4d0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e       ** this con
2e4e0 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64  nection obtained
2e4f0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
2e500 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69  ock above. Or, i
2e510 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  t .      ** may 
2e520 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61  mean that the pa
2e530 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65  ger was in the e
2e540 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
2e550 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75  this.      ** fu
2e560 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
2e570 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
2e580 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
2e590 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  exist..      */.
2e5a0 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65        if( !isOpe
2e5b0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2e5c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e5d0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
2e5e0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
2e5f0 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  s;.        int b
2e600 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20  Exists;         
2e610 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2e620 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2e630 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  sts */.        r
2e640 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
2e650 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20  ess(.           
2e660 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
2e670 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
2e680 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
2e690 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  bExists);.      
2e6a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e6b0 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29  _OK && bExists )
2e6c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2e6d0 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
2e6e0 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
2e6f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2e700 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
2e710 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
2e720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
2e730 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2e740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
2e750 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
2e760 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2e770 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
2e780 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
2e790 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2e7a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e7b0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
2e7c0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
2e7d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e7e0 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51  TE_OK && fout&SQ
2e7f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e800 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
2e810 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2e820 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2e830 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e840 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2e850 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
2e860 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e870 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50    }. .      /* P
2e880 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
2e890 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
2e8a0 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
2e8b0 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  se write.      *
2e8c0 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
2e8d0 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
2e8e0 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61  ck. Purge the ca
2e8f0 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20  che before.     
2e900 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   ** playing back
2e910 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
2e920 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27   so that we don'
2e930 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20  t end up with.  
2e940 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73      ** an incons
2e950 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53  istent cache.  S
2e960 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ync the hot jour
2e970 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
2e980 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62  ng.      ** it b
2e990 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72  ack since the pr
2e9a0 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68  ocess that crash
2e9b0 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20  ed and left the 
2e9c0 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot journal.    
2e9d0 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69    ** probably di
2e9e0 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e  d not sync it an
2e9f0 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65  d we are require
2ea00 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63  d to always sync
2ea10 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
2ea20 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
2ea30 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20  ying it back..  
2ea40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2ea50 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ea60 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
2ea70 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2ea80 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
2ea90 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
2eaa0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
2eab0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2eac0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ead0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2eae0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
2eaf0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
2eb00 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2eb10 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
2eb20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2eb30 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
2eb40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2eb50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  e ){.        pag
2eb60 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
2eb70 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
2eb80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2eb90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2eba0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
2ebb0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2ebc0 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  aken if an error
2ebd0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
2ebe0 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20  ying to open.   
2ebf0 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20       ** or roll 
2ec00 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
2ec10 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  al while holding
2ec20 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
2ec30 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ck. The.        
2ec40 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ** pager_unlock(
2ec50 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  ) routine will b
2ec60 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
2ec70 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c  returning to unl
2ec80 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ock.        ** t
2ec90 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  he file. If the 
2eca0 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66  unlock attempt f
2ecb0 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72  ails, then Pager
2ecc0 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20  .eLock must be. 
2ecd0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f         ** set to
2ece0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73   UNKNOWN_LOCK (s
2ecf0 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
2ed00 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
2ed10 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a   for .        **
2ed20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62   UNKNOWN_LOCK ab
2ed30 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  ove for an expla
2ed40 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20  nation). .      
2ed50 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2ed60 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  In order to get 
2ed70 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74  pager_unlock() t
2ed80 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50  o do this, set P
2ed90 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20  ager.eState to. 
2eda0 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f         ** PAGER_
2edb0 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20  ERROR now. This 
2edc0 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
2edd0 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61  counted as a tra
2ede0 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nsition.        
2edf0 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ** to ERROR stat
2ee00 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64  e in the state d
2ee10 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f  iagram at the to
2ee20 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a  p of this file,.
2ee30 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65          ** since
2ee40 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
2ee50 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70  e same call to p
2ee60 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
2ee70 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20  ll very.        
2ee80 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73  ** shortly trans
2ee90 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ition the pager 
2eea0 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50  object to the OP
2eeb0 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e  EN state. Callin
2eec0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73  g.        ** ass
2eed0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
2eee0 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77  ) would fail now
2eef0 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e  , as it should n
2ef00 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20  ot be possible. 
2ef10 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
2ef20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
2ef30 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65  hen there are ze
2ef40 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ro outstanding p
2ef50 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  age .        ** 
2ef60 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20  references..    
2ef70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
2ef80 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2ef90 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
2efa0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
2efb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
2efc0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2efd0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
2efe0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2eff0 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
2f000 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
2f010 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
2f020 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2f030 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e && pPager->eLo
2f040 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  ck>SHARED_LOCK).
2f050 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
2f060 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
2f070 3e 74 65 6d 70 46 69 6c 65 20 0a 20 20 20 20 20  >tempFile .     
2f080 26 26 20 28 70 50 61 67 65 72 2d 3e 70 42 61 63  && (pPager->pBac
2f090 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63  kup || sqlite3Pc
2f0a0 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
2f0b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
2f0c0 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
2f0d0 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
2f0e0 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
2f0f0 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
2f100 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
2f110 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
2f120 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
2f130 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
2f140 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
2f150 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  s.      ** read 
2f160 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
2f170 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
2f180 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
2f190 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  base.      ** ha
2f1a0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
2f1b0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
2f1c0 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
2f1d0 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a  lush the.      *
2f1e0 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  * cache..      *
2f1f0 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
2f200 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
2f210 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
2f220 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
2f230 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
2f240 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
2f250 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
2f260 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
2f270 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
2f280 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
2f290 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
2f2a0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
2f2b0 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
2f2c0 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
2f2d0 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
2f2e0 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
2f2f0 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
2f300 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
2f310 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
2f320 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
2f330 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
2f340 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
2f350 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
2f360 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
2f370 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
2f380 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
2f390 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
2f3a0 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
2f3b0 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
2f3c0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
2f3d0 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
2f3e0 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  */.      Pgno nP
2f3f0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  age = 0;.      c
2f400 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73  har dbFileVers[s
2f410 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
2f420 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20  FileVers)];..   
2f430 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
2f440 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
2f450 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
2f460 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c  ( rc ) goto fail
2f470 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  ed;..      if( n
2f480 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Page>0 ){.      
2f490 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
2f4a0 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
2f4b0 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
2f4c0 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
2f4d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2f4e0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
2f4f0 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
2f500 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
2f510 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
2f520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f530 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
2f540 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
2f550 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2f560 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
2f570 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
2f580 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
2f590 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
2f5a0 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
2f5b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2f5c0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
2f5d0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
2f5e0 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
2f5f0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
2f600 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
2f610 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2f620 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66  there is a WAL f
2f630 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
2f640 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69  system, open thi
2f650 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41  s database in WA
2f660 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f  L.    ** mode. O
2f670 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f  therwise, the fo
2f680 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
2f690 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
2f6a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2f6b0 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  = pagerOpenWalIf
2f6c0 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b  Present(pPager);
2f6d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2f6e0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73  OMIT_WAL.    ass
2f6f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
2f700 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  l==0 || rc==SQLI
2f710 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a  TE_OK );.#endif.
2f720 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
2f730 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2f740 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
2f750 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2f760 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67     rc = pagerBeg
2f770 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
2f780 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  n(pPager);.  }..
2f790 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
2f7a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2f7b0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2f7c0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
2f7d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2f7e0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62  ger, &pPager->db
2f7f0 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69  Size);.  }.. fai
2f800 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
2f810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f820 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
2f830 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  ;.    pager_unlo
2f840 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
2f850 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2f860 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2f870 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EN );.  }else{. 
2f880 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
2f890 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
2f8a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2f8b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
2f8c0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
2f8d0 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
2f8e0 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ero, rollback an
2f8f0 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e  y active.** tran
2f900 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
2f910 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  ck the pager..**
2f920 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c  .** Except, in l
2f930 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
2f940 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65  USIVE when there
2f950 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69   is nothing to i
2f960 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  n.** the rollbac
2f970 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75  k journal, the u
2f980 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72  nlock is not per
2f990 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65  formed and there
2f9a0 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74   is.** nothing t
2f9b0 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74  o rollback, so t
2f9c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
2f9d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74   no-op..*/ .stat
2f9e0 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
2f9f0 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65  ockIfUnused(Page
2fa00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
2fa10 28 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  ( (sqlite3Pcache
2fa20 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
2fa30 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b  >pPCache)==0) ){
2fa40 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
2fa50 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
2fa60 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
2fa70 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65  * Acquire a refe
2fa80 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75  rence to page nu
2fa90 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67  mber pgno in pag
2faa0 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67  er pPager (a pag
2fab0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68  e.** reference h
2fac0 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29  as type DbPage*)
2fad0 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
2fae0 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ed reference is 
2faf0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
2fb00 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73   obtained, it is
2fb10 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61   copied to *ppPa
2fb20 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
2fb30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2fb40 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
2fb50 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
2fb60 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
2fb70 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
2fb80 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
2fb90 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
2fba0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2fbb0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
2fbc0 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
2fbd0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2fbe0 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
2fbf0 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
2fc00 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
2fc10 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
2fc20 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
2fc30 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
2fc40 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
2fc50 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
2fc60 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
2fc70 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
2fc80 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
2fc90 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
2fca0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
2fcb0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
2fcc0 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
2fcd0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
2fce0 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
2fcf0 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
2fd00 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
2fd10 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
2fd20 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
2fd30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2fd40 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
2fd50 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
2fd60 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
2fd70 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
2fd80 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
2fd90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
2fda0 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
2fdb0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
2fdc0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
2fdd0 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
2fde0 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
2fdf0 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
2fe00 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
2fe10 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
2fe20 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
2fe30 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
2fe40 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
2fe50 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
2fe60 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
2fe70 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
2fe80 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
2fe90 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
2fea0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
2feb0 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
2fec0 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
2fed0 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
2fee0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
2fef0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
2ff00 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
2ff10 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
2ff20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65  occurs in two se
2ff30 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73  perate scenarios
2ff40 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
2ff50 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
2ff60 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
2ff70 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2ff80 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
2ff90 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
2ffa0 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
2ffb0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
2ffc0 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
2ffd0 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
2ffe0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
2fff0 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20   be filled with 
30000 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a  the data read.**
30010 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73        from the s
30020 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  avepoint journal
30030 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  ..**.** If noCon
30040 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68  tent is true, th
30050 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75  en the data retu
30060 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69  rned is zeroed i
30070 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69  nstead of.** bei
30080 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ng read from the
30090 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
300a0 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74  ionally, the bit
300b0 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  s corresponding.
300c0 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61  ** to pgno in Pa
300d0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28  ger.pInJournal (
300e0 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  bitvec of pages 
300f0 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20  already written 
30100 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  to the.** journa
30110 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
30120 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
30130 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
30140 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a  ecs of any open.
30150 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ** savepoints ar
30160 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e  e set. This mean
30170 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  s if the page is
30180 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61   made writable a
30190 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69  t any.** point i
301a0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73  n the future, us
301b0 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ing a call to sq
301c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
301d0 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ), its contents.
301e0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a  ** will not be j
301f0 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73  ournaled. This s
30200 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54  aves IO..**.** T
30210 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
30220 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
30230 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
30240 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
30250 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
30260 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
30270 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
30280 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
30290 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
302a0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  o sqlite3PagerLo
302b0 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
302c0 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c  is routine and L
302d0 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
302e0 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
302f0 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
30300 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
30310 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
30320 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
30330 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
30340 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
30350 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
30360 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70  n whereas Lookup
30370 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
30380 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
30390 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
303a0 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
303b0 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
303c0 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
303d0 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
303e0 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
303f0 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
30400 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c  sary..** Since L
30410 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
30420 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
30430 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
30440 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
30450 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
30460 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
30470 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
30480 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
30490 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
304a0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
304b0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
304c0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
304d0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
304e0 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
304f0 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
30500 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
30510 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
30520 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
30530 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
30540 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
30550 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
30560 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
30570 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
30580 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
30590 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
305a0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
305b0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
305c0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
305d0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
305e0 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  ) );..  if( pgno
305f0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
30600 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
30610 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
30620 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
30630 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
30640 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ate, return an e
30650 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  rror immediately
30660 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
30670 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20 70  e, request the p
30680 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61  age from the PCa
30690 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20  che layer. */.  
306a0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
306b0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
306c0 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
306d0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65  r->errCode;.  }e
306e0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
306f0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
30700 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
30710 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67  , pgno, 1, ppPag
30720 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  e);.  }..  if( r
30730 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30740 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
30750 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
30760 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72  3PcacheFetch() r
30770 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
30780 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   or the.    ** p
30790 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79  ager was already
307a0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
307b0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
307c0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
307d0 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50  d..    ** Set pP
307e0 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20  g to 0 and jump 
307f0 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e  to the exception
30800 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20   handler.  */.  
30810 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67    pPg = 0;.    g
30820 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
30830 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73  e_err;.  }.  ass
30840 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
30850 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  pgno==pgno );.  
30860 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
30870 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  )->pPager==pPage
30880 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  r || (*ppPage)->
30890 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20  pPager==0 );..  
308a0 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  if( (*ppPage)->p
308b0 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74  Pager && !noCont
308c0 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  ent ){.    /* In
308d0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
308e0 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f  cache already co
308f0 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61  ntains an initia
30900 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20  lized copy of.  
30910 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52    ** the page. R
30920 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75  eturn without fu
30930 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20  rther ado.  */. 
30940 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
30950 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  =PAGER_MAX_PGNO 
30960 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  && pgno!=PAGER_M
30970 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
30980 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
30990 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
309a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
309b0 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a  E_OK;..  }else{.
309c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
309d0 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
309e0 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
309f0 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
30a00 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
30a10 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
30a20 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
30a30 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
30a40 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67      pPg = *ppPag
30a50 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  e;.    pPg->pPag
30a60 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
30a70 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
30a80 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
30a90 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
30aa0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
30ab0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d   page.    ** num
30ac0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
30ad0 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e   this, or the un
30ae0 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67  used locking-pag
30af0 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  e, is requested.
30b00 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
30b10 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
30b20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
30b30 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
30b40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
30b50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
30b60 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
30b70 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
30b80 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d      }..    if( M
30b90 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e  EMDB || pPager->
30ba0 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e  dbSize<pgno || n
30bb0 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f  oContent || !isO
30bc0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
30bd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
30be0 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
30bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
30c00 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
30c10 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
30c20 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
30c30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30c40 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
30c50 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
30c60 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
30c70 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
30c80 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
30c90 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
30ca0 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
30cb0 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
30cc0 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
30cd0 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
30ce0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
30cf0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
30d00 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
30d10 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
30d20 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
30d30 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
30d40 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
30d50 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
30d60 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
30d70 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
30d80 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
30d90 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
30da0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30db0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
30dc0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
30dd0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
30de0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
30df0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
30e00 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
30e10 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
30e20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
30e30 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
30e40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
30e50 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
30e60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30e70 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
30e80 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
30e90 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
30ea0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
30eb0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
30ec0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
30ed0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30ee0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
30ef0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30f00 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
30f10 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
30f20 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
30f30 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
30f40 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
30f50 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
30f60 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
30f70 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
30f80 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72  Pager );.      r
30f90 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
30fa0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
30fb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30fc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
30fd0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
30fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30ff0 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
31000 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  hash(pPg);.  }..
31010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31020 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69  OK;..pager_acqui
31030 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74  re_err:.  assert
31040 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31050 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
31060 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
31070 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a  eDrop(pPg);.  }.
31080 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
31090 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a  nused(pPager);..
310a0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
310b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
310c0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
310d0 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
310e0 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
310f0 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
31100 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
31110 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
31120 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
31130 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
31140 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
31150 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
31160 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20  che. .**.** See 
31170 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
31180 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
31190 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
311a0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
311b0 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
311c0 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
311d0 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
311e0 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
311f0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
31200 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
31210 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
31220 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
31230 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
31240 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
31250 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
31260 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
31270 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
31280 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
31290 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
312a0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
312b0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
312c0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
312d0 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
312e0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
312f0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
31300 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
31310 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
31320 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
31330 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
31340 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70  AGER_READER && p
31350 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
31360 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
31370 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
31380 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
31390 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
313a0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
313b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
313c0 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
313d0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
313e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
313f0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
31400 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
31410 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
31420 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
31430 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
31440 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
31450 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
31460 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
31470 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
31480 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
31490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
314a0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
314b0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
314c0 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
314d0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
314e0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
314f0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
31500 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  r;.    sqlite3Pc
31510 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
31520 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
31530 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
31540 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
31550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
31560 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73   called at the s
31570 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72  tart of every wr
31580 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
31590 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61  .** There must a
315a0 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
315b0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
315c0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
315d0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
315e0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
315f0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
31600 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
31610 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
31620 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72  er pPager and wr
31630 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  ite a journal he
31640 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ader.** to the s
31650 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74  tart of it. If t
31660 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
31670 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e  savepoints, open
31680 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
31690 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69  .** as well. Thi
316a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
316b0 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
316c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
316d0 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65   being .** opene
316e0 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c  d to write a rol
316f0 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20  lback log for a 
31700 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
31710 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20  is not used .** 
31720 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68  when opening a h
31730 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
31740 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
31750 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
31760 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
31770 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69  ready open (as i
31780 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c  t may be in excl
31790 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20  usive mode),.** 
317a0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
317b0 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61  on just writes a
317c0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
317d0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
317e0 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  the.** already o
317f0 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  pen file. .**.**
31800 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
31810 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31820 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68   is opened by th
31830 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
31840 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
31850 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75  rnal bitvec stru
31860 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
31870 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
31880 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
31890 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
318a0 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
318b0 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
318c0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68  LITE_NOMEM if th
318d0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  e attempt to all
318e0 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a  ocate Pager.pInJ
318f0 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
31900 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72   .** an IO error
31910 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67   code if opening
31920 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
31930 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
31940 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
31950 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
31960 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
31970 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
31980 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
31990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
319b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
319c0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
319d0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20   pPager->pVfs;  
319e0 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
319f0 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a  of vfs pointer *
31a00 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
31a10 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
31a20 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
31a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
31a40 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
31a50 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
31a60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
31a70 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
31a80 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64   .  /* If alread
31a90 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
31aa0 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
31ab0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
31ac0 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65   But on.  ** the
31ad0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69   other hand, thi
31ae0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
31af0 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  er called if we 
31b00 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
31b10 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61   ** an error sta
31b20 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  te. */.  if( NEV
31b30 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
31b40 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
31b50 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
31b60 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
31b70 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
31b80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
31b90 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
31ba0 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70  ODE_OFF ){.    p
31bb0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
31bc0 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
31bd0 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
31be0 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  dbSize);.    if(
31bf0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
31c00 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nal==0 ){.      
31c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
31c20 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  MEM;.    }.  .  
31c30 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
31c40 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
31c50 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
31c60 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  open. */.    if(
31c70 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
31c80 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
31c90 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
31ca0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
31cb0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
31cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
31cd0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
31ce0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
31cf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31d00 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
31d10 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
31d20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
31d30 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
31d40 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
31d50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
31d60 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
31d70 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
31d80 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61  |.          (pPa
31d90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20  ger->tempFile ? 
31da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51  .            (SQ
31db0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
31dc0 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
31dd0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
31de0 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ):.            (
31df0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
31e00 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20  _JOURNAL).      
31e10 20 20 20 20 29 3b 0a 20 20 23 69 66 64 65 66 20      );.  #ifdef 
31e20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
31e30 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
31e40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
31e50 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
31e60 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
31e70 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
31e80 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
31e90 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
31ea0 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20  ze(pPager).     
31eb0 20 20 20 29 3b 0a 20 20 23 65 6c 73 65 0a 20 20     );.  #else.  
31ec0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31ed0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
31ee0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
31ef0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
31f00 61 67 73 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69  ags, 0);.  #endi
31f10 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
31f20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
31f30 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
31f40 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
31f50 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20      }.  .  .    
31f60 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72  /* Write the fir
31f70 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
31f80 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r to the journal
31f90 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a   file and open .
31fa0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
31fb0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
31fc0 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ary..    */.    
31fd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31fe0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f  K ){.      /* TO
31ff0 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c  DO: Check if all
32000 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65   of these are re
32010 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a  ally required. *
32020 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
32030 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
32040 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
32050 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
32060 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
32070 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
32080 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
32090 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  0;.      rc = wr
320a0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
320b0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
320c0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
320d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
320e0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
320f0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
32100 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
32110 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
32120 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
32130 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32140 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
32150 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
32160 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
32170 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
32180 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a  _CACHEMOD;.  }..
32190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
321a0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72  /*.** Begin a wr
321b0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
321c0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
321d0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
321e0 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72  f a .** write-tr
321f0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
32200 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
32210 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
32220 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
32230 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  ** If the exFlag
32240 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
32250 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  se, then acquire
32260 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
32270 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  RVED.** lock on 
32280 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32290 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  e. If exFlag is 
322a0 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69  true, then acqui
322b0 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61  re at least.** a
322c0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
322d0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
322e0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
322f0 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  , no locking .**
32300 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20   functions need 
32310 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  be called..**.**
32320 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
32330 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
32340 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
32350 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  any sub-journal 
32360 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  opened.** within
32370 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
32380 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  n will be opened
32390 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
323a0 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68   file. This.** h
323b0 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20  as no effect if 
323c0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
323d0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
323e0 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  d (as it may be 
323f0 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  when.** running 
32400 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
32410 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61  e) or if the tra
32420 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nsaction does no
32430 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73  t require a.** s
32440 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  ub-journal. If t
32450 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
32460 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f  argument is zero
32470 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69  , then any requi
32480 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  red.** sub-journ
32490 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  al is implemente
324a0 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70  d in-memory if p
324b0 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d  Pager is an in-m
324c0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
324d0 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74  .** or using a t
324e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74  emporary file ot
324f0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
32500 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
32510 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
32520 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74   int exFlag, int
32530 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a   subjInMemory){.
32540 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
32550 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
32560 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
32570 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
32580 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  rCode;.  assert(
32590 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
325a0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
325b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
325c0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
325d0 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
325e0 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a  emory = (u8)subj
325f0 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28  InMemory;..  if(
32600 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e   ALWAYS(pPager->
32610 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
32620 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73  ADER) ){.    ass
32630 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
32640 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20  Journal==0 );.. 
32650 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
32660 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
32670 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
32680 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ger is configure
32690 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67  d to use locking
326a0 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c  _mode=exclusive,
326b0 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a   and an.      **
326c0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
326d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
326e0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68  is not already h
326f0 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e  eld, obtain it n
32700 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ow..      */.   
32710 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
32720 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
32730 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
32740 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
32750 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  pWal, -1) ){.   
32760 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
32770 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
32780 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
32790 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
327a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
327b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
327c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
327d0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63     sqlite3WalExc
327e0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
327f0 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20  r->pWal, 1);.   
32800 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
32810 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f  rab the write lo
32820 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69  ck on the log fi
32830 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
32840 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20  l, upgrade to.  
32850 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53      ** PAGER_RES
32860 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68  ERVED state. Oth
32870 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
32880 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
32890 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
328a0 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61    ** The busy-ha
328b0 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76  ndler is not inv
328c0 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20  oked if another 
328d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61  connection alrea
328e0 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64  dy.      ** hold
328f0 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  s the write-lock
32900 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  . If possible, t
32910 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
32920 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20  ill call it..   
32930 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
32940 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
32950 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
32960 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
32970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32980 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
32990 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
329a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
329b0 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
329c0 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a  arameter.      *
329d0 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
329e0 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72  immediately upgr
329f0 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45  ade this to an E
32a00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
32a10 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79  he.      ** busy
32a20 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
32a30 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
32a40 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
32a50 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
32a60 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
32a70 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
32a80 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
32a90 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   lock..      */.
32aa0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32ab0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
32ac0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
32ad0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32ae0 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67  ITE_OK && exFlag
32af0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
32b00 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
32b10 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
32b20 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
32b30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
32b40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32b50 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  K ){.      /* Ch
32b60 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c  ange to WRITER_L
32b70 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20  OCKED state..   
32b80 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
32b90 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67  AL mode sets Pag
32ba0 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47  er.eState to PAG
32bb0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
32bc0 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20   or CACHEMOD.   
32bd0 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61     ** when it ha
32be0 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61  s an open transa
32bf0 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72  ction, but never
32c00 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e   to DBMOD or FIN
32c10 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20  ISHED..      ** 
32c20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
32c30 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73 20  in those states 
32c40 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
32c50 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20   back savepoint 
32c60 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
32c70 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20  ctions may copy 
32c80 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75  data from the su
32c90 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  b-journal into t
32ca0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
32cb0 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65     ** file as we
32cc0 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70  ll as into the p
32cd0 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63 68  age cache. Which
32ce0 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72   would be incorr
32cf0 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  ect in .      **
32d00 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20   WAL mode..     
32d10 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
32d20 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
32d30 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a  _WRITER_LOCKED;.
32d40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
32d50 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
32d60 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
32d70 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
32d80 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
32d90 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
32da0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
32db0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
32dc0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
32dd0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
32de0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
32df0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32e00 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
32e10 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
32e20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
32e30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
32e40 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32e50 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
32e60 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  KED );.    asser
32e70 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
32e80 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
32e90 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
32ea0 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE(("TRANSACTION
32eb0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
32ec0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74  pPager)));.  ret
32ed0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
32ee0 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
32ef0 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
32f00 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
32f10 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
32f20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
32f30 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
32f40 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
32f50 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
32f60 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
32f70 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
32f80 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
32f90 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
32fa0 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
32fb0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
32fc0 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
32fd0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
32fe0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
32ff0 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
33000 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
33010 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
33020 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
33030 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
33040 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
33050 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
33060 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
33070 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
33080 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
33090 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  K;..  /* This ro
330a0 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c  utine is not cal
330b0 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69  led unless a wri
330c0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
330d0 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a  as already .  **
330e0 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54   been started. T
330f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
33100 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
33110 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70  e open at this p
33120 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73  oint..  ** It is
33130 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
33140 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
33150 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
33160 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33170 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
33180 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
33190 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
331a0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
331b0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
331c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
331d0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
331e0 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
331f0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
33200 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
33210 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
33220 20 68 61 73 20 62 65 65 6e 20 70 72 65 76 69 6f   has been previo
33230 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20 72  usly detected, r
33240 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65 20 65  eport the same e
33250 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e  rror.  ** again.
33260 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   This should not
33270 20 68 61 70 70 65 6e 2c 20 62 75 74 20 74 68 65   happen, but the
33280 20 63 68 65 63 6b 20 70 72 6f 76 69 64 65 73 20   check provides 
33290 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20  robustness. */. 
332a0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
332b0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72  r->errCode) )  r
332c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
332d0 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67  rCode;..  /* Hig
332e0 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her-level routin
332f0 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  es never call th
33300 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64  is function if d
33310 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20  atabase is not. 
33320 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42   ** writable.  B
33330 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c  ut check anyway,
33340 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74   just for robust
33350 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  ness. */.  if( N
33360 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61  EVER(pPager->rea
33370 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  dOnly) ) return 
33380 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20  SQLITE_PERM;..  
33390 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
333a0 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e  ..  /* The journ
333b0 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
333c0 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68   be opened. High
333d0 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er level routine
333e0 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  s have already. 
333f0 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65   ** obtained the
33400 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73   necessary locks
33410 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72   to begin the wr
33420 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
33430 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f   but the.  ** ro
33440 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
33450 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20  ight not yet be 
33460 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f  open. Open it no
33470 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  w if this is the
33480 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
33490 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
334a0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c  fore calling sql
334b0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
334c0 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67  rty() on the pag
334d0 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  e. .  ** Otherwi
334e0 73 65 2c 20 69 66 20 69 74 20 77 65 72 65 20 64  se, if it were d
334f0 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e  one after callin
33500 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  g sqlite3PcacheM
33510 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e  akeDirty(), then
33520 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d  .  ** an error m
33530 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74  ight occur and t
33540 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65  he pager would e
33550 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f  nd up in WRITER_
33560 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a  LOCKED state.  *
33570 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d 61 72  * with pages mar
33580 6b 65 64 20 61 73 20 64 69 72 74 79 20 69 6e 20  ked as dirty in 
33590 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a  the cache..  */.
335a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
335b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
335c0 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
335d0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
335e0 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
335f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
33600 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
33610 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
33620 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33630 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
33640 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73  CACHEMOD );.  as
33650 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
33660 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
33670 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74   );..  /* Mark t
33680 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
33690 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
336a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
336b0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
336c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
336d0 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
336e0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
336f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
33700 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
33710 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e   if( pageInJourn
33720 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a  al(pPg) && !subj
33730 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
33740 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
33750 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
33760 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c 73 65  ager) );.  }else
33770 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  {.  .    /* The 
33780 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
33790 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
337a0 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
337b0 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20  ERVED or an.    
337c0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
337d0 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
337e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
337f0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
33800 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  page to.    ** t
33810 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
33820 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
33830 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
33840 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
33850 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  ( !pageInJournal
33860 28 70 50 67 29 20 26 26 20 21 70 61 67 65 72 55  (pPg) && !pagerU
33870 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
33880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33890 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
338a0 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  r)==0 );.      i
338b0 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
338c0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
338d0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
338e0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
338f0 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20     u32 cksum;.  
33900 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
33910 61 32 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  a2;.        i64 
33920 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  iOff = pPager->j
33930 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20 20  ournalOff;..    
33940 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
33950 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
33960 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
33970 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
33980 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
33990 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
339a0 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
339b0 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
339c0 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  ifies.        **
339d0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
339e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
339f0 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
33a00 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
33a10 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  ger) );..       
33a20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33a30 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61  >journalHdr<=pPa
33a40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
33a50 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
33a60 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
33a70 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
33a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
33a90 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
33aa0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
33ab0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
33ac0 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a   (u8*)pData2);..
33ad0 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20          /* Even 
33ae0 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b  if an IO or disk
33af0 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72  full error occur
33b00 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c  s while journall
33b10 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20  ing the.        
33b20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
33b30 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
33b40 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
33b50 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
33b60 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  .        ** Othe
33b70 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
33b80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
33b90 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
33ba0 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20  logic in.       
33bb0 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65   ** playback_one
33bc0 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69  _page() will thi
33bd0 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  nk that the page
33be0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
33bf0 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tored.        **
33c00 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
33c10 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e   file. And if an
33c20 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
33c30 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   while doing so,
33c40 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
33c50 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
33c60 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20  follow..        
33c70 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  */.        pPg->
33c80 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
33c90 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20  EED_SYNC;..     
33ca0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
33cb0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
33cc0 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   iOff, pPg->pgno
33cd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
33ce0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
33cf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
33d00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
33d10 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
33d20 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
33d30 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66  r->pageSize, iOf
33d40 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66  f+4);.        if
33d50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33d60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
33d70 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
33d80 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
33d90 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e  d, iOff+pPager->
33da0 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75  pageSize+4, cksu
33db0 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  m);.        if( 
33dc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
33dd0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
33de0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
33df0 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
33e00 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
33e10 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
33e20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
33e30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
33e40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
33e50 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f  ;.        PAGER_
33e60 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
33e70 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29  er_writej_count)
33e80 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
33e90 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE(("JOURNAL %
33ea0 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
33eb0 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
33ec0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
33ed0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
33ee0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  ), pPg->pgno, . 
33ef0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
33f00 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
33f10 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20  EED_SYNC)?1:0), 
33f20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
33f30 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  Pg)));..        
33f40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
33f50 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72  ff += 8 + pPager
33f60 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
33f70 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
33f80 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
33f90 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
33fa0 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
33fb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33fc0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
33fd0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
33fe0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
33ff0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
34000 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
34010 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
34030 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
34040 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  EM );.        rc
34050 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69   |= addToSavepoi
34060 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
34070 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
34080 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
340a0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
340b0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
340c0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
340d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
340e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
340f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
34100 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
34110 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20  RITER_DBMOD ){. 
34120 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
34130 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
34140 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
34150 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
34160 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64  RACE(("APPEND %d
34170 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
34180 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
34190 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
341a0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
341b0 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
341c0 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
341d0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
341e0 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20  )?1:0)));.      
341f0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
34200 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
34210 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
34220 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
34230 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
34240 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
34250 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
34260 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
34270 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
34280 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
34290 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
342a0 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
342b0 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
342c0 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
342d0 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
342e0 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
342f0 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
34300 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
34310 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75      if( subjRequ
34320 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
34330 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
34340 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
34350 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
34360 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
34370 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
34380 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
34390 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
343a0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
343b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
343c0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d  = pPg->pgno;.  }
343d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
343e0 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
343f0 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
34400 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69  able. This routi
34410 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
34420 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b  d before .** mak
34430 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ing changes to a
34440 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65   page. The calle
34450 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  r must check the
34460 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a   return value .*
34470 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  * of this functi
34480 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  on and be carefu
34490 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20  l not to change 
344a0 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
344b0 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f  less .** this ro
344c0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
344d0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
344e0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
344f0 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
34500 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
34510 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
34520 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
34530 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
34540 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
34550 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
34560 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
34570 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
34580 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
34590 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
345a0 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
345b0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
345c0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
345d0 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
345e0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
345f0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
34600 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
34610 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
34620 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
34630 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ** as appropriat
34640 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
34650 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
34660 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34670 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
34680 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
34690 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
346a0 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
346b0 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
346c0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
346d0 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
346e0 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
346f0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
34700 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
34710 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
34720 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
34730 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
34740 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
34750 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
34760 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
34770 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
34780 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
34790 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65   );..  if( nPage
347a0 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
347b0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
347c0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
347d0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
347e0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
347f0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
34800 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
34810 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
34820 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
34830 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
34840 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
34850 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20  t nPage = 0;    
34860 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
34870 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
34880 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
34890 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
348a0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
348b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
348c0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
348d0 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  t needSync = 0; 
348e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
348f0 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20  if any page has 
34900 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
34910 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  */..    /* Set t
34920 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  he doNotSyncSpil
34930 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  l flag to 1. Thi
34940 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
34950 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20  cannot allow.   
34960 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65   ** a journal he
34970 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
34980 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
34990 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
349a0 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75  y.    ** this fu
349b0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
349c0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
349d0 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
349e0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
349f0 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ncSpill==0 );.  
34a00 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
34a10 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20  yncSpill++;..   
34a20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
34a30 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
34a40 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
34a50 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
34a60 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
34a70 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
34a80 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
34a90 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
34aa0 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
34ab0 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
34ac0 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
34ad0 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
34ae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
34af0 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
34b00 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
34b10 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
34b20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20     nPageCount = 
34b30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
34b40 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
34b50 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  o>nPageCount ){.
34b60 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
34b70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
34b80 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
34b90 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
34ba0 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
34bb0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
34bc0 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
34bd0 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -pg1;.    }else{
34be0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
34bf0 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20  PagePerSector;. 
34c00 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
34c10 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73  nPage>0);.    as
34c20 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70  sert(pg1<=pPg->p
34c30 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
34c40 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
34c50 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f  ->pgno);..    fo
34c60 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
34c70 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
34c80 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  K; ii++){.      
34c90 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69  Pgno pg = pg1+ii
34ca0 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  ;.      PgHdr *p
34cb0 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Page;.      if( 
34cc0 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
34cd0 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
34ce0 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
34cf0 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20  ournal, pg) ){. 
34d00 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
34d10 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
34d20 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
34d30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
34d40 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
34d50 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
34d60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
34d70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34d80 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
34d90 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
34da0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
34db0 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
34dc0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
34dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
34de0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
34df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
34e10 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
34e20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34e30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
34e40 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70  e if( (pPage = p
34e50 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
34e60 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20  er, pg))!=0 ){. 
34e70 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
34e80 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
34e90 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
34ea0 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
34eb0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
34ec0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
34ed0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
34ee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
34ef0 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44    /* If the PGHD
34f00 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
34f10 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20   is set for any 
34f20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67  of the nPage pag
34f30 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  es .    ** start
34f40 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e  ing at pg1, then
34f50 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
34f60 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  set for all of t
34f70 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20  hem. Because.   
34f80 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61   ** writing to a
34f90 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67  ny of these nPag
34fa0 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61  e pages may dama
34fb0 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74  ge the others, t
34fc0 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
34fd0 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74  l file must cont
34fe0 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70  ain sync()ed cop
34ff0 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68  ies of all of th
35000 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  em.    ** before
35010 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e   any of them can
35020 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
35030 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
35040 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
35050 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35060 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29  OK && needSync )
35070 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
35080 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20  !MEMDB );.      
35090 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
350a0 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
350b0 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
350c0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
350d0 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
350e0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
350f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
35100 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
35110 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
35120 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35130 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
35140 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
35150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
35160 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35170 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d  >doNotSyncSpill=
35180 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
35190 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
351a0 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
351b0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
351c0 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
351d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
351e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
351f0 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
35200 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
35210 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
35220 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
35230 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35240 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
35250 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
35260 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
35270 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
35280 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
35290 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
352a0 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
352b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
352c0 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
352d0 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c    return pPg->fl
352e0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b  ags&PGHDR_DIRTY;
352f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
35300 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
35310 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
35320 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
35330 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
35340 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
35350 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
35360 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f  page pPg back to
35370 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
35380 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
35390 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
353a0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 54  ked as dirty.  T
353b0 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72  his happens, for
353c0 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a   example, when.*
353d0 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62  * the page has b
353e0 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c  een added as a l
353f0 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c  eaf of the freel
35400 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a  ist and so its.*
35410 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e  * content no lon
35420 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a  ger matters..**.
35430 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67  ** The overlying
35440 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20   software layer 
35450 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
35460 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74  ne when all of t
35470 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68  he data.** on th
35480 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20  e given page is 
35490 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67 65  unused. The page
354a0 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
354b0 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
354c0 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
354d0 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
354e0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
354f0 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
35500 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
35510 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  n quadruple the 
35520 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a  speed of large .
35530 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  ** DELETE operat
35540 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ions..*/.void sq
35550 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
35560 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
35570 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
35580 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
35590 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67    if( (pPg->flag
355a0 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26  s&PGHDR_DIRTY) &
355b0 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  & pPager->nSavep
355c0 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50  oint==0 ){.    P
355d0 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54  AGERTRACE(("DONT
355e0 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
355f0 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
35600 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
35610 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41  er)));.    IOTRA
35620 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64  CE(("CLEAN %p %d
35630 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
35640 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67  ->pgno)).    pPg
35650 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
35660 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 20 20 20  _DONT_WRITE;.   
35670 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
35680 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a  ash(pPg);.  }.}.
35690 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
356a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
356b0 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   increment the v
356c0 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
356d0 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68  base file .** ch
356e0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74  ange-counter, st
356f0 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74 65  ored as a 4-byte
35700 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
35710 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74 20  ger starting at 
35720 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20  .** byte offset 
35730 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
35740 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
35750 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
35760 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68  flag is zero, th
35770 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  en this is done 
35780 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73  by calling .** s
35790 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
357a0 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  () on page 1, th
357b0 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  en modifying the
357c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
357d0 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49  .** page data. I
357e0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
357f0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64  file will be upd
35800 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75  ated when the cu
35810 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  rrent.** transac
35820 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
35830 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44  d..**.** The isD
35840 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d  irectMode flag m
35850 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a  ay only be non-z
35860 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61  ero if the libra
35870 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a  ry was compiled.
35880 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ** with the SQLI
35890 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
358a0 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66  _WRITE macro def
358b0 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ined. In this ca
358c0 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65  se,.** if isDire
358d0 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ct is non-zero, 
358e0 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
358f0 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  e file is update
35900 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79  d directly.** by
35910 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61   writing an upda
35920 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ted version of p
35930 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61  age 1 using a ca
35940 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71  ll to the .** sq
35950 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66  lite3OsWrite() f
35960 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
35970 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
35980 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
35990 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
359a0 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29  nt isDirectMode)
359b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
359c0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
359d0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
359e0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
359f0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
35a00 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
35a10 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
35a20 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
35a30 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
35a40 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
35a50 29 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65  );..  /* Declare
35a60 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
35a70 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
35a80 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20   'isDirect'. If 
35a90 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d  the.  ** atomic-
35aa0 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
35ab0 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e  on is enabled in
35ac0 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65   this build, the
35ad0 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20  n isDirect.  ** 
35ae0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
35af0 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
35b00 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65  ed as the isDire
35b10 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  ctMode parameter
35b20 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75  .  ** to this fu
35b30 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
35b40 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
35b50 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  set to zero..  *
35b60 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20  *.  ** The idea 
35b70 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61  is that if the a
35b80 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
35b90 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  mization is not.
35ba0 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20    ** enabled at 
35bb0 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
35bc0 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f  e compiler can o
35bd0 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66  mit the tests of
35be0 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27  .  ** 'isDirect'
35bf0 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20   below, as well 
35c00 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63  as the block enc
35c10 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a  losed in the.  *
35c20 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20  * "if( isDirect 
35c30 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20  )" condition..  
35c40 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
35c50 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
35c60 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44  WRITE.# define D
35c70 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61  IRECT_MODE 0.  a
35c80 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d  ssert( isDirectM
35c90 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  ode==0 );.  UNUS
35ca0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
35cb0 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73  irectMode);.#els
35cc0 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  e.# define DIREC
35cd0 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d  T_MODE isDirectM
35ce0 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  ode.#endif..  if
35cf0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
35d00 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50  eCountDone && pP
35d10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
35d20 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
35d30 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
35d40 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
35d50 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
35d60 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
35d70 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  nter;           
35d80 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
35d90 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74   of change-count
35da0 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20  er field */..   
35db0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
35dc0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73  ->tempFile && is
35dd0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
35de0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   );..    /* Open
35df0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
35e00 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
35e10 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
35e20 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
35e30 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
35e40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
35e50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  gHdr==0 || rc==S
35e60 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
35e70 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20   /* If page one 
35e80 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63  was fetched succ
35e90 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68  essfully, and th
35ea0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
35eb0 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  ot.    ** operat
35ec0 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f  ing in direct-mo
35ed0 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20  de, make page 1 
35ee0 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20  writable.  When 
35ef0 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64  not in .    ** d
35f00 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65  irect mode, page
35f10 20 31 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c   1 is always hel
35f20 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68  d in cache and h
35f30 65 6e 63 65 20 74 68 65 20 50 61 67 65 72 47 65  ence the PagerGe
35f40 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  t().    ** above
35f50 20 69 73 20 61 6c 77 61 79 73 20 73 75 63 63 65   is always succe
35f60 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68  ssful - hence th
35f70 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d  e ALWAYS on rc==
35f80 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a  SQLITE_OK..    *
35f90 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52 45 43  /.    if( !DIREC
35fa0 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53  T_MODE && ALWAYS
35fb0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
35fc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
35fd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
35fe0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPgHdr);.    }..
35ff0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
36010 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
36020 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
36030 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
36040 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
36050 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  .      change_co
36060 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
36070 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61  et4byte((u8*)pPa
36080 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
36090 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63  ;.      change_c
360a0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
360b0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
360c0 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
360d0 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
360e0 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ter);..      /* 
360f0 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
36100 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
36110 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
36120 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 20 20  ..99 and in.    
36130 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39    ** bytes 92..9
36140 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e  5 store the chan
36150 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77  ge counter for w
36160 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e  hich the version
36170 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
36180 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
36190 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
361a0 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44  char*)pPgHdr->pD
361b0 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
361c0 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 20 20  counter);.      
361d0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
361e0 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
361f0 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
36200 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20  ION_NUMBER);..  
36210 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
36220 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65  g in direct mode
36230 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  , write the cont
36240 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74  ents of page 1 t
36250 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  o the file. */. 
36260 20 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f       if( DIRECT_
36270 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MODE ){.        
36280 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
36290 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
362a0 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
362b0 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
362c0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
362d0 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20   pPgHdr->pData, 
362e0 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f  1, 6, rc=SQLITE_
362f0 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20  NOMEM, zBuf);.  
36300 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36320 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36330 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
36340 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
36350 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b  r->pageSize, 0);
36360 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36370 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36390 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
363a0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
363b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
363c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
363d0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
363e0 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
363f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
36400 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
36410 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
36420 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
36430 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
36440 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
36450 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
36460 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36470 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73  to disk. This is
36480 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d   a no-op for in-
36490 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
364a0 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74  .** or pages wit
364b0 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  h the Pager.noSy
364c0 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  nc flag set..**.
364d0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
364e0 2c 20 6f 72 20 69 66 20 63 61 6c 6c 65 64 20 6f  , or if called o
364f0 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68  n a pager for wh
36500 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ich it is a no-o
36510 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  p, this.** funct
36520 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
36530 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
36540 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
36550 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
36560 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
36570 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
36580 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
36590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
365a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
365b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
365c0 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
365d0 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
365e0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
365f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36600 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
36610 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
36620 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
36630 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
36640 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65  .  }.  if( isOpe
36650 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
36660 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
36670 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
36680 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
36690 54 4c 5f 53 59 4e 43 2c 20 28 76 6f 69 64 20 2a  TL_SYNC, (void *
366a0 29 26 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  )&rc);.  }.  ret
366b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
366c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
366d0 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
366e0 64 20 77 68 69 6c 65 20 61 20 77 72 69 74 65 2d  d while a write-
366f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
36700 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c  ctive in.** roll
36710 62 61 63 6b 2e 20 49 66 20 74 68 65 20 63 6f 6e  back. If the con
36720 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41  nection is in WA
36730 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6c  L mode, this cal
36740 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a  l is a no-op. .*
36750 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
36760 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  the connection d
36770 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
36780 68 61 76 65 20 61 6e 20 45 58 43 4c 55 53 49 56  have an EXCLUSIV
36790 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68  E lock on .** th
367a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
367b0 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
367c0 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e  ade to obtain on
367d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
367e0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
367f0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 6f  s already held o
36800 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
36810 20 6f 62 74 61 69 6e 20 69 74 20 69 73 0a 2a 2a   obtain it is.**
36820 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
36830 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
36840 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 53  s in WAL mode, S
36850 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
36860 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rned..** Otherwi
36870 73 65 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  se, either SQLIT
36880 45 5f 42 55 53 59 20 6f 72 20 61 6e 20 53 51 4c  E_BUSY or an SQL
36890 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
368a0 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
368b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
368c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
368d0 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61 67 65 72  lusiveLock(Pager
368e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
368f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36900 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36910 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36920 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
36930 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
36940 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36950 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 0a  R_WRITER_DBMOD .
36960 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
36970 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36980 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0a 20  WRITER_LOCKED . 
36990 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
369a0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
369b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66  (pPager) );.  if
369c0 28 20 30 3d 3d 70 61 67 65 72 55 73 65 57 61 6c  ( 0==pagerUseWal
369d0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
369e0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
369f0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
36a00 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
36a10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
36a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
36a30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36a40 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
36a50 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
36a60 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
36a70 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
36a80 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
36a90 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
36aa0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
36ab0 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
36ac0 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
36ad0 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
36ae0 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
36af0 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
36b00 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
36b10 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
36b20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
36b30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36b40 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a   ensures that:.*
36b50 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  *.**   * The dat
36b60 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
36b70 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64  e-counter is upd
36b80 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  ated,.**   * the
36b90 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
36ba0 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ed (unless the a
36bb0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
36bc0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
36bd0 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69  ),.**   * all di
36be0 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72  rty pages are wr
36bf0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
36c00 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20  abase file, .** 
36c10 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
36c20 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
36c30 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ed (if required)
36c40 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
36c50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
36c60 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ynced. .**.** Th
36c70 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
36c80 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  t remains to com
36c90 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
36ca0 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69  ion is to finali
36cb0 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20  ze .** (delete, 
36cc0 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
36cd0 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
36ce0 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  of) the journal 
36cf0 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c  file (or .** del
36d00 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
36d10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
36d20 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
36d30 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
36d40 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
36d50 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
36d60 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
36d70 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
36d80 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
36d90 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
36da0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
36db0 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
36dc0 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
36dd0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
36de0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36df0 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
36e00 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
36e10 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
36e20 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
36e30 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
36e40 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
36e50 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
36e60 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
36e70 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
36e80 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
36e90 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
36ea0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
36eb0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
36ec0 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
36ed0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
36ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
36ef0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
36f00 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
36f10 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
36f20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
36f30 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
36f40 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
36f50 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  oSync           
36f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
36f70 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78  ue to omit the x
36f80 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66  Sync on the db f
36f90 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
36fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
36fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
36fc0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
36fd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36fe0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
36ff0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
37000 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
37010 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37020 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
37030 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
37040 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37050 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
37060 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
37070 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a  te==PAGER_ERROR.
37080 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
37090 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
370a0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
370b0 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20 65 72  /* If a prior er
370c0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65  ror occurred, re
370d0 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f 72 20  port that error 
370e0 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  again. */.  if( 
370f0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
37100 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
37110 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
37120 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
37130 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
37140 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
37150 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20  %s nSize=%d\n", 
37160 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
37170 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
37180 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
37190 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  e));..  /* If no
371a0 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
371b0 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65  s have been made
371c0 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
371d0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
371e0 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52  >eState<PAGER_WR
371f0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 20  ITER_CACHEMOD ) 
37200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37210 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  ;..  if( MEMDB )
37220 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
37230 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
37240 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
37250 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
37260 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
37270 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68     ** function h
37280 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
37290 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f  called, it is mo
372a0 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48  stly a no-op.  H
372b0 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20  owever, any.    
372c0 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f  ** backup in pro
372d0 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62  gress needs to b
372e0 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20  e restarted..   
372f0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
37300 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
37310 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
37320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
37330 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
37340 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50 67 48  er) ){.      PgH
37350 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
37360 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
37370 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
37380 68 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  he);.      if( p
37390 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
373a0 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61  rc = pagerWalFra
373b0 6d 65 73 28 70 50 61 67 65 72 2c 20 70 4c 69 73  mes(pPager, pLis
373c0 74 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t, pPager->dbSiz
373d0 65 2c 20 31 2c 20 0a 20 20 20 20 20 20 20 20 20  e, 1, .         
373e0 20 20 20 28 70 50 61 67 65 72 2d 3e 66 75 6c 6c     (pPager->full
373f0 53 79 6e 63 20 3f 20 70 50 61 67 65 72 2d 3e 73  Sync ? pPager->s
37400 79 6e 63 46 6c 61 67 73 20 3a 20 30 29 0a 20 20  yncFlags : 0).  
37410 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
37420 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
37430 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37440 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
37450 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
37460 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
37470 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
37480 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
37490 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61  owing block upda
374a0 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63  tes the change-c
374b0 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20  ounter. Exactly 
374c0 68 6f 77 20 69 74 0a 20 20 20 20 20 20 2a 2a 20  how it.      ** 
374d0 64 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e 64  does this depend
374e0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
374f0 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75  not the atomic-u
37500 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
37510 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  on.      ** was 
37520 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
37530 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20  le time, and if 
37540 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
37550 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20 20 20   meets the .    
37560 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69    ** runtime cri
37570 74 65 72 69 61 20 74 6f 20 75 73 65 20 74 68 65  teria to use the
37580 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20   operation: .   
37590 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
375a0 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73    * The file-sys
375b0 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
375c0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
375d0 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 20  operty for.     
375e0 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20   **      blocks 
375f0 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a  of size page-siz
37600 65 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a  e, and .      **
37610 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69      * This commi
37620 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  t is not part of
37630 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
37640 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
37650 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61       **    * Exa
37660 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61  ctly one page ha
37670 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
37680 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65  and store in the
37690 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
376a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
376b0 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
376c0 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61  tion was not ena
376d0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
376e0 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  time, then the. 
376f0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e       ** pager_in
37700 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
37710 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  () function is c
37720 61 6c 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20  alled to update 
37730 74 68 65 20 63 68 61 6e 67 65 0a 20 20 20 20 20  the change.     
37740 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27   ** counter in '
37750 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20  indirect-mode'. 
37760 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
37770 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ion is compiled 
37780 69 6e 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  in but.      ** 
37790 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c  is not applicabl
377a0 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61  e to this transa
377b0 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69  ction, call sqli
377c0 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
377d0 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  ().      ** to m
377e0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75  ake sure the jou
377f0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63  rnal file has ac
37800 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61  tually been crea
37810 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20  ted, then call. 
37820 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e       ** pager_in
37830 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
37840 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  () to update the
37850 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
37860 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20  in indirect.    
37870 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20    ** mode. .    
37880 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74    **.      ** Ot
37890 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
378a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
378b0 62 6f 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64  both enabled and
378c0 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20   applicable,.   
378d0 20 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20     ** then call 
378e0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
378f0 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70  ecounter() to up
37900 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
37910 63 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a  counter.      **
37920 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f 64   in 'direct' mod
37930 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
37940 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37950 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20   will never be. 
37960 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20       ** created 
37970 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63  for this transac
37980 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
37990 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45   #ifdef SQLITE_E
379a0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
379b0 54 45 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  TE.      PgHdr *
379c0 70 50 67 3b 0a 20 20 20 20 20 20 61 73 73 65 72  pPg;.      asser
379d0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
379e0 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
379f0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
37a00 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
37a10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
37a20 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
37a30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
37a40 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
37a50 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
37a60 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
37a70 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65  zMaster && isOpe
37a80 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a  n(pPager->jfd) .
37a90 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
37aa0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
37ab0 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
37ac0 67 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20  ger) .       && 
37ad0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
37ae0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
37af0 7a 65 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d  ze.       && (0=
37b00 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50  =(pPg = sqlite3P
37b10 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
37b20 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
37b30 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72   || 0==pPg->pDir
37b40 74 79 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ty).      ){.   
37b50 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
37b60 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
37b70 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68  e counter via th
37b80 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d  e direct-write m
37b90 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20  ethod. The .    
37ba0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
37bb0 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66   call will modif
37bc0 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  y the in-memory 
37bd0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
37be0 66 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  f page 1 .      
37bf0 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20    ** to include 
37c00 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e  the updated chan
37c10 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74  ge counter and t
37c20 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31  hen write page 1
37c30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72   .        ** dir
37c40 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
37c50 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61  abase file. Beca
37c60 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69  use of the atomi
37c70 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 20  c-write .       
37c80 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20   ** property of 
37c90 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
37ca0 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61  stem, this is sa
37cb0 66 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  fe..        */. 
37cc0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
37cd0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
37ce0 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
37cf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
37d00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37d10 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
37d20 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
37d30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
37d40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37d50 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
37d60 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
37d70 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
37d80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37d90 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72  .  #else.      r
37da0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
37db0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
37dc0 67 65 72 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69  ger, 0);.  #endi
37dd0 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  f.      if( rc!=
37de0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
37df0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
37e00 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
37e10 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
37e20 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
37e30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
37e40 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
37e50 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 62  pages.      ** b
37e60 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
37e70 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
37e80 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
37e90 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
37ea0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54        ** file. T
37eb0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
37ec0 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
37ed0 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  um mode..      *
37ee0 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72  *.      ** Befor
37ef0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61  e reading the pa
37f00 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
37f10 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74 68 61  mbers larger tha
37f20 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
37f30 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
37f40 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73   Pager.dbSize, s
37f50 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74  et dbSize back t
37f60 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  o the value.    
37f70 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f    ** that it too
37f80 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  k at the start o
37f90 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
37fa0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  n. Otherwise, th
37fb0 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73  e.      ** calls
37fc0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
37fd0 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72  Get() return zer
37fe0 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61  oed pages instea
37ff0 64 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 72  d of .      ** r
38000 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  eading data from
38010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
38020 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23  le..      */.  #
38030 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
38040 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
38050 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
38060 64 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  dbSize<pPager->d
38070 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20  bOrigSize .     
38080 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
38090 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
380a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a  JOURNALMODE_OFF.
380b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
380c0 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20   Pgno i;        
380d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
380e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
380f0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
38100 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
38110 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41   Pgno iSkip = PA
38120 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
38130 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20  er); /* Pending 
38140 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20  lock page */.   
38150 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20       const Pgno 
38160 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
38170 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f  >dbSize;       /
38180 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61 67 65  * Database image
38190 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20   size */ .      
381a0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
381b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
381c0 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 66  gSize;.        f
381d0 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20  or( i=dbSize+1; 
381e0 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  i<=pPager->dbOri
381f0 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  gSize; i++ ){.  
38200 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
38210 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
38220 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
38230 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69  l, i) && i!=iSki
38240 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
38250 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 20 20   PgHdr *pPage;  
38260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
38270 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge to journal */
38280 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
38290 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
382a0 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
382b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
382c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
382d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
382e0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
382f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
38300 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
38310 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
38320 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
38330 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
38340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
38350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
38360 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
38370 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
38380 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
38390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
383a0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62  ger->dbSize = db
383b0 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 20 0a 20  Size;.      } . 
383c0 20 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 20   #endif.  .     
383d0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
383e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
383f0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
38400 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61  al file. If a ma
38410 73 74 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a  ster .      ** j
38420 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
38430 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
38440 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
38450 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a   journal file, .
38460 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a        ** or if z
38470 4d 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28  Master is NULL (
38480 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
38490 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  l), then this ca
384a0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
384b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
384c0 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
384d0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
384e0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
384f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
38500 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
38510 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
38520 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  .      /* Sync t
38530 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
38540 61 6e 64 20 77 72 69 74 65 20 61 6c 6c 20 64 69  and write all di
38550 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
38560 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
38570 20 2a 2a 20 49 66 20 74 68 65 20 61 74 6f 6d 69   ** If the atomi
38580 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
38590 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 75  ation is being u
385a0 73 65 64 2c 20 74 68 69 73 20 73 79 6e 63 20 77  sed, this sync w
385b0 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a  ill not .      *
385c0 2a 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75  * create the jou
385d0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72  rnal file or per
385e0 66 6f 72 6d 20 61 6e 79 20 72 65 61 6c 20 49 4f  form any real IO
385f0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
38600 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
38610 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 70  change-counter p
38620 61 67 65 20 77 61 73 20 6a 75 73 74 20 6d 6f 64  age was just mod
38630 69 66 69 65 64 2c 20 75 6e 6c 65 73 73 20 74 68  ified, unless th
38640 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 6f 6d 69  e.      ** atomi
38650 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
38660 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69 74  ation is used it
38670 20 69 73 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   is almost certa
38680 69 6e 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  in that the.    
38690 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 72 65 71    ** journal req
386a0 75 69 72 65 73 20 61 20 73 79 6e 63 20 68 65 72  uires a sync her
386b0 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 6e 20 6c  e. However, in l
386c0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
386d0 75 73 69 76 65 0a 20 20 20 20 20 20 2a 2a 20 6f  usive.      ** o
386e0 6e 20 61 20 73 79 73 74 65 6d 20 75 6e 64 65 72  n a system under
386f0 20 6d 65 6d