/ Hex Artifact Content
Login

Artifact 382b3dd2b5c39691f5545454287c232d196c2353:


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 20 20 75 38  file I/O */.  u8
7300: 20 68 61 73 53 65 65 6e 53 74 72 65 73 73 3b 20   hasSeenStress; 
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67            /* pag
7320: 65 72 53 74 72 65 73 73 28 29 20 63 61 6c 6c 65  erStress() calle
7330: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 69  d one or more ti
7340: 6d 65 73 20 2a 2f 0a 20 20 75 38 20 69 73 53 6f  mes */.  u8 isSo
7350: 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  rter;           
7360: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
7370: 20 61 20 50 41 47 45 52 5f 53 4f 52 54 45 52 20   a PAGER_SORTER 
7380: 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  */..  /*********
7390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73d0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  *.  ** The follo
73e0: 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61  wing block conta
73f0: 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20  ins those class 
7400: 6d 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61  members that cha
7410: 6e 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  nge during.  ** 
7420: 72 6f 75 74 69 6e 65 20 6f 70 65 72 74 69 6f 6e  routine opertion
7430: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
7440: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
7450: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
7460: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
7470: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
7480: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
7490: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
74a0: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
74b0: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
74c0: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
74d0: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
74e0: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
74f0: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7500: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7510: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7520: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7530: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
7540: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
7550: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
7560: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
7570: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
7580: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
7590: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
75a0: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
75b0: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
75e0: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
75f0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7600: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7630: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
7640: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
7650: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
7660: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
7670: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
7680: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
7690: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
76a0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
76b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
76c0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
76d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
76e0: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
76f0: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7700: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7710: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7720: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7730: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 53  .  u8 doNotSyncS
7740: 70 69 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  pill;          /
7750: 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 73 70  * Do not do a sp
7760: 69 6c 6c 20 74 68 61 74 20 72 65 71 75 69 72 65  ill that require
7770: 73 20 6a 72 6e 6c 20 73 79 6e 63 20 2a 2f 0a 20  s jrnl sync */. 
7780: 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79   u8 subjInMemory
7790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77a0: 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d  True to use in-m
77b0: 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61  emory sub-journa
77c0: 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53  ls */.  Pgno dbS
77d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
77e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
77f0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
7800: 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f  tabase */.  Pgno
7810: 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20   dbOrigSize;    
7820: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
7830: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
7840: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
7850: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c   */.  Pgno dbFil
7860: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
7870: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
7880: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
7890: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
78a0: 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b 20  gno dbHintSize; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
78c0: 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46 43  lue passed to FC
78d0: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63 61  NTL_SIZE_HINT ca
78e0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  ll */.  int errC
78f0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7900: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
7910: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
7920: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rrors */.  int n
7930: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
7940: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
7950: 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65  journalled since
7960: 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77   last j-header w
7970: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20  ritten */.  u32 
7980: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
7990: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
79a0: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
79b0: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
79c0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e  cksum */.  u32 n
79d0: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
79e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
79f0: 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74   of records writ
7a00: 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e  ten to sub-journ
7a10: 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  al */.  Bitvec *
7a20: 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  pInJournal;     
7a30: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
7a40: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
7a50: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7a60: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
7a70: 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20  ile *fd;        
7a80: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a90: 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61  iptor for databa
7aa0: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
7ab0: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
7ac0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7ad0: 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20  riptor for main 
7ae0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
7af0: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
7b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7b10: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7b20: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7b30: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7b50: 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66  Current write of
7b60: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
7b70: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
7b80: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
7b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
7ba0: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
7bb0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
7bc0: 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  der */.  sqlite3
7bd0: 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
7be0: 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
7bf0: 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69  to list of ongoi
7c00: 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ng backup proces
7c10: 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53 61  ses */.  PagerSa
7c20: 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f  vepoint *aSavepo
7c30: 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66  int; /* Array of
7c40: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
7c50: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76  ts */.  int nSav
7c60: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20  epoint;         
7c70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7c80: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61   elements in aSa
7c90: 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63  vepoint[] */.  c
7ca0: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
7cb0: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
7cc0: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
7cd0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
7ce0: 6e 67 65 73 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a  nges */.  /*.  *
7cf0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75  * End of the rou
7d00: 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20  tinely-changing 
7d10: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20  class members.  
7d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20  ***********/..  
7d70: 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20  u16 nExtra;     
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7d90: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
7da0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
7db0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
7dc0: 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  16 nReserve;    
7dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7de0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
7df0: 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65  ytes at end of e
7e00: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33  ach page */.  u3
7e10: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
7e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
7e30: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
7e40: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
7e50: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7e70: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
7e80: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
7e90: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  ck */.  int page
7ea0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
7eb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7ec0: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
7ed0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
7ee0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
7ef0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
7f00: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
7f10: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
7f20: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
7f30: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
7f40: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
7f50: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
7f60: 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  files */.  char 
7f70: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
7f80: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
7f90: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
7fa0: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
7fb0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
7fc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7fd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7fe0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
7ff0: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
8000: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
8010: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
8020: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
8030: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
8040: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
8050: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
8060: 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20  ndler */.#ifdef 
8070: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
8080: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20  t nHit, nMiss;  
8090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
80a0: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
80b0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ing */.  int nRe
80c0: 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ad, nWrite;     
80d0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
80e0: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
80f0: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
8100: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
8110: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
8120: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
8130: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
8140: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
8150: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
8160: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
8170: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
8180: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8190: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
81a0: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
81b0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
81c0: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
81d0: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
81e0: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
81f0: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
8200: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
8210: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
8220: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
8230: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
8240: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8260: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
8270: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
8280: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8290: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
82a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
82b0: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
82c0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
82d0: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
82e0: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
82f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
8300: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
8310: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
8320: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8330: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
8340: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8350: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
8360: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
8370: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
8380: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8390: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
83a0: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
83b0: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
83c0: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  log */.#endif.};
83d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
83e0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
83f0: 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e  iables hold coun
8400: 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  ters used for.**
8410: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
8420: 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76  s only.  These v
8430: 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  ariables do not 
8440: 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f  exist in.** a no
8450: 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e  n-testing build.
8460: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
8470: 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64  s are not thread
8480: 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  -safe..*/.#ifdef
8490: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
84a0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72   sqlite3_pager_r
84b0: 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  eaddb_count = 0;
84c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
84d0: 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64   full pages read
84e0: 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20   from DB */.int 
84f0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
8500: 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  itedb_count = 0;
8510: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8520: 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74  full pages writt
8530: 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20  en to DB */.int 
8540: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
8550: 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  itej_count = 0; 
8560: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8570: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8580: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65   journal */.# de
8590: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
85a0: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
85b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
85c0: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  R(v).#endif..../
85d0: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
85e0: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
85f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
8600: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
8610: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
8620: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
8630: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
8640: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
8650: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
8660: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
8670: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
8680: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
8690: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
86a0: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
86b0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
86c0: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
86d0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
86e0: 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72  l is being.** wr
86f0: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
8700: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
8710: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
8720: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
8730: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
8740: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
8750: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
8760: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
8770: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
8780: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
8790: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
87a0: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
87b0: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
87c0: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
87d0: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
87e0: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
87f0: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
8800: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
8810: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
8820: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8830: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
8840: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
8850: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
8860: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
8870: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
8880: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
8890: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
88a0: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
88b0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
88c0: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
88d0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
88e0: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
88f0: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
8900: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
8910: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
8920: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
8930: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
8940: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
8950: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
8960: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
8970: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
8980: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
8990: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
89a0: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
89b0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
89c0: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
89d0: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
89e0: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
89f0: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
8a00: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
8a10: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
8a20: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
8a30: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
8a40: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
8a50: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
8a60: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
8a70: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
8a80: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
8a90: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
8aa0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
8ab0: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
8ac0: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
8ad0: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
8ae0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
8af0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
8b00: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
8b10: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
8b20: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
8b30: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
8b40: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
8b50: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  he size of the o
8b60: 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f  f each page reco
8b70: 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  rd in the journa
8b80: 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  l is given by.**
8b90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
8ba0: 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  acro..*/.#define
8bb0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
8bc0: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
8bd0: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
8be0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
8bf0: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
8c00: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
8c10: 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
8c20: 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a  the same .** siz
8c30: 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69  e as a single di
8c40: 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61  sk sector. See a
8c50: 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a  lso setSectorSiz
8c60: 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  e()..*/.#define 
8c70: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8c80: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
8c90: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
8ca0: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
8cb0: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
8cc0: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
8cd0: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
8ce0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
8cf0: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
8d00: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
8d10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
8d20: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
8d30: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
8d40: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
8d50: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
8d60: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
8d70: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
8d80: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
8d90: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
8da0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8db0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
8dc0: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
8dd0: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
8de0: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
8df0: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
8e00: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
8e10: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
8e20: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
8e30: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
8e40: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
8e50: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
8e60: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
8e70: 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65   macro is a file
8e80: 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70   descriptor (typ
8e90: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e sqlite3_file*)
8ea0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
8eb0: 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c   it is not open,
8ec0: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75   or non-zero (bu
8ed0: 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69  t not 1) if it i
8ee0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
8ef0: 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73   so that express
8f00: 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74  ions can be writ
8f10: 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
8f20: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
8f30: 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a  r->jfd) ){ ....*
8f40: 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a  *.** instead of.
8f50: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67  **.**   if( pPag
8f60: 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
8f70: 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66  s ){ ....*/.#def
8f80: 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20  ine isOpen(pFd) 
8f90: 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73  ((pFd)->pMethods
8fa0: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
8fb0: 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67  true if this pag
8fc0: 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d  er uses a write-
8fd0: 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61  ahead log instea
8fe0: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
8ff0: 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
9000: 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61  al. Otherwise fa
9010: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  lse..*/.#ifndef 
9020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
9030: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
9040: 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50  UseWal(Pager *pP
9050: 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
9060: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30  (pPager->pWal!=0
9070: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
9080: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
9090: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
90a0: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
90b0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
90c0: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
90d0: 78 2c 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e  x,y,z) 0.# defin
90e0: 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  e pagerOpenWalIf
90f0: 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54  Present(z) SQLIT
9100: 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61  E_OK.# define pa
9110: 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
9120: 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54  saction(z) SQLIT
9130: 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  E_OK.#endif..#if
9140: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a  ndef NDEBUG ./*.
9150: 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20  ** Usage:.**.** 
9160: 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
9170: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
9180: 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  ger) );.**.** Th
9190: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73  is function runs
91a0: 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f   many asserts to
91b0: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63   try to find inc
91c0: 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a  onsistencies in.
91d0: 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ** the internal 
91e0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67  state of the Pag
91f0: 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  er object..*/.st
9200: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
9210: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
9220: 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a  r *p){.  Pager *
9230: 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f  pPager = p;..  /
9240: 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20  * State must be 
9250: 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65  valid. */.  asse
9260: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50  rt( p->eState==P
9270: 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20  AGER_OPEN.      
9280: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9290: 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20  AGER_READER.    
92a0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
92b0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
92c0: 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
92d0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
92e0: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
92f0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9300: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9310: 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c  R_DBMOD.       |
9320: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9330: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
9340: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9350: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
9360: 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52  ROR.  );..  /* R
9370: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
9380: 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20   current state, 
9390: 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e  a temp-file conn
93a0: 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65  ection always be
93b0: 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66  haves.  ** as if
93c0: 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75   it has an exclu
93d0: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
93e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
93f0: 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73  It never updates
9400: 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65  .  ** the change
9410: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20  -counter field, 
9420: 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  so the changeCou
9430: 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61  ntDone flag is a
9440: 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  lways set..  */.
9450: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
9460: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65  pFile==0 || p->e
9470: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
9480: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
9490: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
94a0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   || pPager->chan
94b0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a  geCountDone );..
94c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a    /* If the useJ
94d0: 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63  ournal flag is c
94e0: 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61  lear, the journa
94f0: 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22  l-mode must be "
9500: 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20  OFF". .  ** And 
9510: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  if the journal-m
9520: 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68  ode is "OFF", th
9530: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
9540: 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e  ust not be open.
9550: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9560: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9570: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9580: 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a  E_OFF || p->useJ
9590: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
95a0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
95b0: 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
95c0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73  LMODE_OFF || !is
95d0: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a  Open(p->jfd) );.
95e0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
95f0: 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e   MEMDB implies n
9600: 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e  oSync. And an in
9610: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
9620: 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69   Since .  ** thi
9630: 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65  s means an in-me
9640: 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f  mory pager perfo
9650: 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c  rms no IO at all
9660: 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f  , it cannot enco
9670: 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68  unter .  ** eith
9680: 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  er SQLITE_IOERR 
9690: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64  or SQLITE_FULL d
96a0: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f  uring rollback o
96b0: 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69  r while finalizi
96c0: 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e  ng .  ** a journ
96d0: 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75  al file. (althou
96e0: 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  gh the in-memory
96f0: 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65   journal impleme
9700: 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a  ntation may .  *
9710: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
9720: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c  IOERR_NOMEM whil
9730: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
9740: 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  le is being writ
9750: 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69  ten). It .  ** i
9760: 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20  s therefore not 
9770: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20  possible for an 
9780: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
9790: 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
97a0: 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a  OR .  ** state..
97b0: 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42    */.  if( MEMDB
97c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
97d0: 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20  p->noSync );.   
97e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
97f0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9800: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
9810: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
9820: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9830: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
9840: 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20  MORY .    );.   
9850: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61   assert( p->eSta
9860: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
9870: 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  && p->eState!=PA
9880: 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
9890: 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
98a0: 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d  Wal(p)==0 );.  }
98b0: 0a 0a 20 20 2f 2a 20 41 20 73 6f 72 74 65 72 20  ..  /* A sorter 
98c0: 69 73 20 61 20 74 65 6d 70 20 66 69 6c 65 20 74  is a temp file t
98d0: 68 61 74 20 6e 65 76 65 72 20 73 70 69 6c 6c 73  hat never spills
98e0: 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 61 6c 77   to disk and alw
98f0: 61 79 73 20 68 61 73 0a 20 20 2a 2a 20 74 68 65  ays has.  ** the
9900: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67   doNotSpill flag
9910: 20 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20   set.  */.  if( 
9920: 70 2d 3e 69 73 53 6f 72 74 65 72 20 29 7b 0a 20  p->isSorter ){. 
9930: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65     assert( p->te
9940: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 61 73  mpFile );.    as
9950: 73 65 72 74 28 20 70 2d 3e 64 6f 4e 6f 74 53 70  sert( p->doNotSp
9960: 69 6c 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ill );.    asser
9970: 74 28 20 70 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  t( p->fd->pMetho
9980: 64 73 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  ds==0 );.  }..  
9990: 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e  /* If changeCoun
99a0: 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20  tDone is set, a 
99b0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72  RESERVED lock or
99c0: 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
99d0: 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68   held.  ** on th
99e0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  e file..  */.  a
99f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
9a00: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d  hangeCountDone==
9a10: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
9a20: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9a30: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9a40: 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ->eLock!=PENDING
9a50: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74  _LOCK );..  swit
9a60: 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b  ch( p->eState ){
9a70: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
9a80: 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  OPEN:.      asse
9a90: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
9aa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9ab0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9ac0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9ad0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9ae0: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
9af0: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
9b00: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
9b10: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
9b20: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9b30: 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20  PAGER_READER:.  
9b40: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9b50: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9b60: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9b70: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9b80: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9b90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ba0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  p->eLock>=SHARED
9bb0: 5f 4c 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65  _LOCK || p->noRe
9bc0: 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  adlock );.      
9bd0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9be0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
9bf0: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
9c00: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9c10: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9c20: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9c30: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9c40: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9c50: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
9c60: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9c70: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9c80: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9c90: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
9ca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9cb0: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
9cc0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
9cd0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9ce0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
9cf0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
9d00: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
9d10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9d20: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
9d30: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
9d40: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9d50: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9d60: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
9d70: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9d80: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
9d90: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
9da0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9db0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9dc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9dd0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9de0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9df0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
9e00: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
9e10: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
9e20: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
9e30: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
9e40: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
9e50: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
9e60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
9e70: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
9e80: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
9e90: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
9ea0: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
9eb0: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
9ec0: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
9ed0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
9ee0: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
9ef0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
9f00: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
9f10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9f20: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
9f30: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
9f40: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
9f50: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
9f60: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9f70: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9f80: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
9fa0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9fb0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9fc0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
9fd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9fe0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9ff0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a000: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a010: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a020: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a030: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a040: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a050: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a060: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a070: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a080: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a090: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a0a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a0b0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a0c0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a0d0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a0e0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a0f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a100: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a110: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a120: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a130: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a140: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a150: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a160: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a170: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a180: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a190: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a1a0: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a1b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a1c0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
a1d0: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a1e0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a1f0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a200: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
a210: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a220: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a230: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a240: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a250: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a260: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a270: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
a280: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
a290: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a2a0: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a2b0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a2c0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a2d0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a2f0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a300: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a310: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a320: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a330: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
a340: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
a350: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
a360: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
a370: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
a380: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
a390: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
a3a0: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
a3b0: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
a3c0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
a3d0: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
a3e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
a3f0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a400: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a410: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
a420: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a430: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
a440: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
a450: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
a460: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a470: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a480: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a490: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a4a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a4b0: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a4c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a4d0: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a4e0: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a4f0: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a500: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a510: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a520: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a530: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a540: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a550: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a560: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a570: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a580: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a590: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
a5a0: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
a5b0: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
a5c0: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
a5d0: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
a5e0: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
a5f0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
a600: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
a610: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
a620: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
a630: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
a640: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
a650: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
a660: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
a670: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
a680: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
a690: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
a6a0: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
a6b0: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
a6c0: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
a6d0: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
a6e0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
a6f0: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
a700: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
a710: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
a720: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
a730: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
a740: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
a750: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
a760: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
a770: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
a780: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
a790: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
a7a0: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
a7b0: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
a7c0: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
a7d0: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
a7e0: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
a7f0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a800: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
a810: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
a820: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
a830: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a840: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
a850: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
a860: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a870: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
a880: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
a890: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
a8a0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a8b0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a8c0: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
a8d0: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
a8e0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a8f0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
a900: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
a910: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
a920: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a930: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
a940: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
a950: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
a960: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
a970: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
a980: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
a990: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
a9a0: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
a9b0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
a9c0: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
a9d0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
a9e0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a9f0: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
aa00: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
aa10: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
aa20: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
aa30: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
aa40: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
aa50: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
aa60: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
aa70: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
aa80: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
aa90: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
aaa0: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
aab0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aac0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
aad0: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
aae0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aaf0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ab00: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
ab10: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
ab20: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ab30: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ab40: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
ab50: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
ab60: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ab70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ab80: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
ab90: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
aba0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
abb0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
abc0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
abd0: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
abe0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
abf0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ac00: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
ac10: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
ac20: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
ac30: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
ac40: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
ac50: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
ac60: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
ac70: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
ac80: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
ac90: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
aca0: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
acb0: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
acc0: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
acd0: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
ace0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
acf0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
ad00: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
ad10: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
ad20: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
ad30: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
ad40: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
ad50: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
ad60: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
ad70: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
ad80: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
ad90: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
ada0: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
adb0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
adc0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
add0: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
ade0: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
adf0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
ae00: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
ae10: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
ae20: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
ae30: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
ae40: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
ae50: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
ae60: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
ae70: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
ae80: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
ae90: 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
aea0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
aeb0: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Pager;.  int i;.
aec0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
aed0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
aee0: 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72   i++){.    Pager
aef0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
af00: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
af10: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
af20: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
af30: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
af40: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
af50: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
af60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
af70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
af80: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
af90: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
afa0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
afb0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
afc0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
afd0: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
afe0: 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  al(PgHdr *pPg){.
aff0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b000: 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e  BitvecTest(pPg->
b010: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
b020: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
b030: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
b040: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b050: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b060: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b070: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b080: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b090: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b0a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b0b0: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b0c0: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b0d0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b0e0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b0f0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b100: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b110: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b120: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b130: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b140: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b150: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b160: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b170: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b180: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b190: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b1a0: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b1b0: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b1c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b1d0: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b1e0: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b1f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b200: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b210: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b220: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b230: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b240: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b250: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b260: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b270: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b280: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b290: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b2a0: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b2b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b2c0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b2d0: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b2e0: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b2f0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b300: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b310: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b320: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b330: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b340: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b350: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b360: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b370: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b380: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b390: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b3a0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
b3b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b3c0: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
b3d0: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
b3e0: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
b3f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
b400: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
b410: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
b420: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
b430: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
b440: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
b450: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
b460: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
b470: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
b480: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b490: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b4a0: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b4b0: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b4c0: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
b4d0: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
b4e0: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
b4f0: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b500: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
b510: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b520: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
b530: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b540: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
b550: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
b560: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
b570: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b580: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
b590: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
b5a0: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
b5b0: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
b5c0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b5d0: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
b5e0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b5f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b600: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
b610: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
b620: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
b630: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
b640: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
b650: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
b660: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
b670: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
b680: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
b690: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ock);.    if( pP
b6a0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  ager->eLock!=UNK
b6b0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
b6c0: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
b6d0: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
b6e0: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
b6f0: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
b700: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
b710: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
b720: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
b730: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b740: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b750: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b760: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
b770: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
b780: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
b790: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
b7a0: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
b7b0: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
b7c0: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
b7d0: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
b7e0: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
b7f0: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
b800: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b810: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b820: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b830: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
b840: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
b850: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
b860: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
b870: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
b880: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
b890: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
b8a0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
b8b0: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
b8c0: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
b8d0: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
b8e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b8f0: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
b900: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
b910: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
b920: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
b930: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
b940: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
b950: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
b960: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
b970: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
b980: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
b990: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
b9a0: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
b9b0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
b9c0: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
b9d0: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
b9e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
b9f0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
ba00: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
ba10: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
ba20: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
ba30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
ba40: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
ba50: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
ba60: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
ba70: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
ba80: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
ba90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
baa0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bab0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bac0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bad0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bae0: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
baf0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bb00: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
bb10: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bb20: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bb30: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bb40: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bb50: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bb60: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bb70: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bb80: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bb90: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bba0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
bbb0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
bbc0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
bbd0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
bbe0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
bbf0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
bc00: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
bc10: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bc20: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
bc30: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
bc40: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
bc50: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
bc60: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
bc70: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
bc80: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
bc90: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
bca0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
bcb0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
bcc0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
bcd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
bce0: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
bcf0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
bd00: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
bd10: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
bd20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
bd30: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
bd40: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
bd50: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
bd60: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
bd70: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
bd80: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
bd90: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
bda0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
bdb0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
bdc0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
bdd0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
bde0: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
be10: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
be20: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
be30: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
be40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
be50: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
be60: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
be90: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
bea0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
beb0: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
bec0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
bed0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
bee0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
bef0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
bf00: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
bf10: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
bf20: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
bf30: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
bf40: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
bf50: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
bf60: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
bf70: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
bf80: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
bf90: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
bfa0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
bfb0: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
bfc0: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
bfd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
bfe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
bff0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c000: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c010: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c020: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c030: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c040: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c050: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c060: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c070: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c080: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c090: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c0a0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c0b0: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c0c0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c0d0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c0e0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c0f0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c100: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c110: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c120: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c130: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c140: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c150: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c160: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c170: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c180: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c190: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c1a0: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c1b0: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c1c0: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c1d0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c1e0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c1f0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c200: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c210: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c220: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c230: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c240: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c250: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c260: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c270: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c280: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c290: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c2a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c2b0: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c2c0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c2d0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c2e0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c2f0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c300: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c310: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c320: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c330: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c340: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c350: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c360: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c370: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c380: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c390: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c3a0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c3b0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c3c0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c3d0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c3e0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c3f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c400: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c410: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c420: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c430: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c440: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c450: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c460: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c470: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c480: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c490: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c4a0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c4b0: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c4c0: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c4d0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c4e0: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c4f0: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c500: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c510: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c520: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c530: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c540: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c550: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c560: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c570: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c580: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c590: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c5a0: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
c5b0: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
c5c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
c5d0: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
c5e0: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
c5f0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
c600: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
c610: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
c620: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
c630: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
c640: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
c650: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
c660: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
c670: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
c680: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
c690: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
c6a0: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
c6b0: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
c6c0: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
c6d0: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
c6e0: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
c6f0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
c700: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
c710: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
c720: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
c730: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
c740: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
c750: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
c760: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
c770: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
c780: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
c790: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
c7a0: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
c7b0: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
c7c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
c7d0: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
c7e0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
c7f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
c800: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c810: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
c820: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c830: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
c840: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
c850: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
c860: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
c870: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
c880: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
c890: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
c8a0: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
c8b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
c8c0: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
c8d0: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
c8e0: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
c8f0: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
c900: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c910: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
c920: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
c930: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
c940: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
c950: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
c960: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
c970: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
c980: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c990: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
c9a0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
c9b0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c9c0: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
c9d0: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
c9e0: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
c9f0: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
ca00: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
ca10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
ca20: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ca30: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
ca40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
ca50: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
ca60: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
ca70: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
ca80: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
caa0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cab0: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cac0: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cad0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
caf0: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cb00: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
cb10: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
cb40: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cb50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cb60: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cb70: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cb80: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cb90: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cba0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
cbb0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cbc0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cbd0: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
cbe0: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
cbf0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cc00: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cc10: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
cc20: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
cc30: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
cc40: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cc50: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
cc60: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
cc70: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
cc80: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
cc90: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
cca0: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
ccb0: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
ccc0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
ccd0: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
cce0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ccf0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
cd00: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
cd10: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
cd20: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
cd30: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
cd40: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
cd50: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
cd60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cd70: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
cd80: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
cd90: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
cda0: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
cdb0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
cdc0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
cdd0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
cde0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
cdf0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
ce00: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
ce10: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
ce20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
ce30: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
ce40: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
ce50: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
ce60: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
ce70: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
ce80: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
ce90: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
cea0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
ceb0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
cec0: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
ced0: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
cee0: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
cef0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cf00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
cf10: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
cf20: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
cf30: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
cf40: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
cf50: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
cf60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
cf70: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
cf80: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
cf90: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
cfa0: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
cfb0: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
cfc0: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
cfd0: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
cfe0: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
cff0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d020: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d050: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d060: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d070: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d080: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d090: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d0b0: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d0c0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d0d0: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d0e0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d0f0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d100: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d110: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d120: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d130: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d140: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d150: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d160: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d170: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d180: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d190: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d1a0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d1b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d1c0: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d1d0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d1e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d1f0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d200: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d210: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d220: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d230: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d240: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d250: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d260: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d270: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
d280: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
d290: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
d2a0: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
d2b0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
d2c0: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
d2d0: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
d2e0: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
d2f0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d300: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
d310: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
d320: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
d330: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
d340: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
d350: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
d360: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
d370: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
d380: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
d390: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
d3a0: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
d3b0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
d3c0: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
d3d0: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
d3e0: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
d3f0: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
d400: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
d410: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
d420: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
d430: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
d440: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
d450: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
d460: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
d470: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
d480: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
d490: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
d4a0: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
d4b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
d4c0: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
d4d0: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
d4e0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
d4f0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
d500: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
d510: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
d520: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
d530: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
d540: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
d550: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
d560: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
d570: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
d580: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
d590: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
d5a0: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
d5b0: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
d5c0: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
d5d0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
d5e0: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
d5f0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
d600: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
d610: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
d620: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
d650: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
d660: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
d670: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
d680: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
d690: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
d6a0: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
d6b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
d6c0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
d6d0: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
d6e0: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
d6f0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
d700: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
d710: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
d720: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
d730: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d740: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
d750: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
d760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d770: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
d780: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
d790: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
d7a0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
d7b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
d7c0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
d7d0: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
d7e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d7f0: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
d800: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
d810: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d820: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
d830: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
d840: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
d850: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
d860: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
d870: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
d880: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
d890: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
d8a0: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
d8b0: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
d8c0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
d8d0: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
d8e0: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
d8f0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
d900: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
d910: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
d920: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
d930: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
d940: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
d950: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
d960: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
d970: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
d980: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
d990: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
d9a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
d9b0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
d9c0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
d9d0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
d9e0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
d9f0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
da00: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
da10: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
da20: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
da30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
da40: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
da50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
da60: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
da70: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
da80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
da90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
daa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
dab0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
dac0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
dad0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
dae0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
daf0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
db00: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
db10: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
db20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
db30: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
db40: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
db50: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
db60: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
db70: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
db80: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
db90: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
dba0: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
dbb0: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
dbc0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
dbd0: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
dbe0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
dbf0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
dc00: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
dc10: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
dc20: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
dc30: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
dc40: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
dc50: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
dc60: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
dc70: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
dc80: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
dc90: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
dca0: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
dcb0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
dcc0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
dcd0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
dce0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
dcf0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
dd00: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
dd10: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
dd20: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
dd30: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
dd40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dd50: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
dd60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
dd70: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
dd80: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
dd90: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
dda0: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
ddb0: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
ddc0: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
ddd0: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
dde0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
ddf0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
de00: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
de10: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
de20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
de30: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
de40: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
de50: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
de80: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
de90: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
dea0: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
deb0: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
dec0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
ded0: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
dee0: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
def0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
df00: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
df10: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
df20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
df30: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
df40: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
df50: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
df60: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
df70: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
df80: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
df90: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
dfa0: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
dfb0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
dfc0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
dfd0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
dfe0: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
dff0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e000: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e010: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e020: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e030: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e040: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e050: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e060: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e070: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e080: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e090: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e0a0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e0b0: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e0c0: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e0d0: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e0e0: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e0f0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e100: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e110: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e120: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e130: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e140: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e150: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e160: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e170: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e180: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e190: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e1a0: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e1b0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e1c0: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e1d0: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e1e0: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e1f0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e200: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e210: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e220: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e230: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e240: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e250: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e260: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e270: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e280: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e290: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e2a0: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e2b0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e2c0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e2d0: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e2e0: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e2f0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e300: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e310: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e320: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e330: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e340: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e350: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e360: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e370: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e380: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e390: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e3a0: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e3b0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e3c0: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e3d0: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e3e0: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e3f0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e400: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e410: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
e420: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e430: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
e440: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
e450: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
e460: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
e470: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
e480: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
e490: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
e4a0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
e4b0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e4c0: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
e4d0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
e4e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
e4f0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
e500: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
e510: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
e520: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
e530: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
e540: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
e550: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
e560: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
e570: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
e580: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
e590: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
e5a0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e5b0: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
e5c0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e5d0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e5e0: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
e5f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
e600: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
e610: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e620: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
e630: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
e640: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
e650: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71  ialiser */ .  sq
e660: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
e670: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
e680: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
e690: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e6a0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
e6b0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e6c0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
e6d0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e6e0: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
e6f0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
e700: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
e710: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e720: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e730: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
e740: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
e750: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
e760: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
e770: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
e780: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e790: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e7a0: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
e7b0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
e7c0: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
e7d0: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
e7e0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e7f0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e800: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
e810: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
e820: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
e830: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
e840: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
e850: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
e860: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
e870: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
e880: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
e890: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
e8a0: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
e8b0: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
e8c0: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
e8d0: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
e8e0: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
e8f0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
e900: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
e910: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
e920: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e930: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
e940: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
e950: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
e960: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
e970: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
e980: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
e990: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
e9a0: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
e9b0: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
e9c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
e9d0: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
e9e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
e9f0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
ea00: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
ea10: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
ea20: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
ea30: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
ea40: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
ea50: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
ea60: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
ea70: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
ea80: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
ea90: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
eaa0: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
eab0: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
eac0: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
ead0: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
eae0: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
eaf0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
eb00: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
eb10: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
eb20: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
eb30: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
eb40: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
eb50: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
eb60: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
eb70: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
eb80: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
eb90: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
eba0: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
ebb0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
ebc0: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
ebd0: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
ebe0: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
ebf0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
ec00: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
ec10: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
ec20: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
ec30: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
ec40: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
ec50: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
ec60: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
ec70: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
ec80: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
ec90: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
eca0: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
ecb0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
ecc0: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
ecd0: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
ece0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
ecf0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
ed00: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
ed10: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
ed20: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
ed30: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
ed40: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ed50: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
ed60: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
ed70: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
ed80: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
ed90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
eda0: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
edb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
edc0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
edd0: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
ede0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
edf0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
ee00: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
ee10: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
ee20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
ee30: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
ee40: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
ee50: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
ee60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
ee70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
ee80: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
ee90: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
eea0: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
eeb0: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
eec0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
eed0: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
eee0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
eef0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
ef00: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
ef10: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
ef20: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
ef30: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
ef40: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
ef50: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
ef60: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
ef70: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
ef80: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
ef90: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
efa0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
efb0: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
efc0: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
efd0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
efe0: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
eff0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f000: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f010: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f020: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f030: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f040: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f050: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f060: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f070: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f080: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f090: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f0a0: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f0b0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f0c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f0d0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f0e0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f0f0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f100: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f110: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f120: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f130: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f140: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f150: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f160: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f170: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f180: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f190: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f1a0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f1b0: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f1c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f1d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f1e0: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f1f0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f210: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f220: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f230: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f250: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f260: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f270: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f280: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f290: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f2a0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f2b0: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f2c0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f2e0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f2f0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f300: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f310: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f340: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f350: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f360: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f370: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f380: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f390: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f3b0: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f3c0: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f3d0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f3e0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f3f0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f400: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f410: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
f420: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
f430: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
f440: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
f450: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
f460: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
f470: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
f480: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
f490: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
f4a0: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
f4b0: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
f4c0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
f4d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f4e0: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
f4f0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
f500: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
f510: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
f520: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
f530: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
f540: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f550: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
f560: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
f570: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
f580: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
f590: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
f5a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f5b0: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
f5c0: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
f5d0: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
f5e0: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
f5f0: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
f600: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
f610: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
f620: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
f630: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
f640: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
f650: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
f660: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
f670: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
f680: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
f690: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
f6a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f6b0: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
f6c0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
f6d0: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
f6e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
f6f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f710: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
f720: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
f730: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
f740: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f750: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
f760: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
f770: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
f780: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
f790: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f7a0: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
f7b0: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
f7c0: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
f7d0: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
f7e0: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
f7f0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
f800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f810: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
f820: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
f830: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
f840: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
f850: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
f860: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
f870: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
f880: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
f890: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f8a0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f8b0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
f8c0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
f8d0: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
f8e0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f8f0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f900: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
f910: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
f920: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f930: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
f940: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
f950: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
f960: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
f970: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
f980: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
f990: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
f9a0: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f9c0: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
f9d0: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
f9e0: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
f9f0: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
fa00: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
fa10: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fa20: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
fa30: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
fa40: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fa50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fa60: 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
fa70: 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
fa80: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
fa90: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
faa0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
fab0: 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
fac0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
fad0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fae0: 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
faf0: 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
fb00: 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
fb10: 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
fb20: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
fb30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
fb40: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
fb50: 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
fb60: 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
fb70: 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
fb80: 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
fb90: 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
fba0: 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
fbb0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
fbc0: 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
fbd0: 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
fbe0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
fbf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
fc00: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
fc10: 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
fc20: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
fc30: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
fc40: 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
fc50: 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
fc60: 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
fc70: 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
fc80: 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
fc90: 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
fca0: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
fcb0: 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
fcc0: 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
fcd0: 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
fce0: 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
fcf0: 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
fd00: 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
fd10: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fd20: 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
fd30: 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
fd40: 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
fd50: 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
fd60: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
fd70: 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
fd80: 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
fd90: 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
fda0: 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
fdb0: 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
fdc0: 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
fdd0: 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
fde0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
fdf0: 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
fe00: 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
fe10: 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
fe20: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
fe30: 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
fe40: 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
fe50: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
fe60: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
fe70: 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
fe80: 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
fe90: 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
fea0: 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
feb0: 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
fec0: 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
fed0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
fee0: 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
fef0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
ff00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
ff10: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
ff20: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
ff30: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
ff40: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
ff50: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
ff60: 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
ff70: 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
ff80: 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
ff90: 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
ffa0: 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
ffb0: 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
ffc0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
ffd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ffe0: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
fff0: 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
10000 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
10010 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
10020 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
10030 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
10040 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10050 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10060 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10070 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10080 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10090 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
100a0 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
100b0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
100c0 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
100d0 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
100e0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
100f0 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
10100 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
10110 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
10120 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
10130 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
10140 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10150 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10160 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10170 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10180 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10190 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
101a0 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
101b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
101c0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
101d0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
101e0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
101f0 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
10200 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10210 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
10220 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
10230 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
10240 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10250 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10260 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10270 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10280 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10290 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
102a0 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
102b0 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
102c0 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
102d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
102e0 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
102f0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
10300 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
10310 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
10320 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
10330 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
10340 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10350 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10360 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
10370 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10380 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
10390 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
103a0 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
103b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
103c0 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
103d0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
103e0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
103f0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
10400 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
10410 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
10420 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
10430 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
10440 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10450 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10460 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
10470 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
10480 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
10490 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
104a0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
104b0 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
104c0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
104d0 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
104e0 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
104f0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
10500 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
10510 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
10520 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
10530 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
10540 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10550 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10560 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10570 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10590 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
105a0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
105b0 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
105d0 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
105e0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
105f0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10610 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
10620 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
10630 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
10640 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10660 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10670 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10680 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
106b0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
106c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
106d0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
106e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
106f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
10700 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
10710 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
10720 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10730 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10740 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10750 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
10760 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
10770 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
10780 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
107a0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
107b0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
107c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
107d0 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
107e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
107f0 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
10800 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
10810 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
10820 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
10830 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
10840 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10850 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10860 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10870 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10880 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10890 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
108a0 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
108b0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
108c0 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
108d0 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
108e0 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
108f0 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10900 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10910 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10920 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10930 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10940 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10950 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10960 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10970 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10980 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10990 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
109a0 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
109b0 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
109c0 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
109d0 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
109e0 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
109f0 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
10a00 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
10a10 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
10a20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
10a30 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
10a40 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
10a50 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
10a60 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
10a70 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10a80 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10a90 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
10aa0 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
10ab0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10ac0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10ad0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10ae0 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
10af0 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
10b00 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10b10 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10b20 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10b30 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
10b40 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10b50 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10b60 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10b70 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
10b80 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
10b90 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10ba0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10bb0 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
10bc0 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
10bd0 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
10be0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10bf0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
10c00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10c10 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
10c20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
10c30 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
10c40 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
10c50 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
10c60 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
10c70 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
10c80 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
10c90 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10ca0 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
10cb0 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
10cc0 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
10cd0 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
10ce0 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
10cf0 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
10d00 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
10d10 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
10d20 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
10d30 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
10d40 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
10d50 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
10d60 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
10d70 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
10d80 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
10d90 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
10da0 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
10db0 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
10dc0 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
10dd0 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
10de0 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
10df0 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
10e00 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
10e10 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
10e20 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
10e30 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
10e40 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
10e50 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
10e60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
10e70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10e80 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
10e90 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
10ea0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
10eb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10ec0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
10ed0 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
10ee0 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
10ef0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
10f00 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
10f10 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
10f20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
10f30 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
10f40 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
10f50 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
10f60 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
10f70 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
10f80 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
10f90 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fb0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10fc0 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
10fd0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
10fe0 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
10ff0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
11000 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
11010 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
11020 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
11030 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
11040 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
11050 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
11060 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
11070 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
11080 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
11090 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
110a0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   p;.}../*.** Dis
110b0 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20  card the entire 
110c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
110d0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63  in-memory page-c
110e0 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ache..*/.static 
110f0 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
11100 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11110 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
11120 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
11130 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
11140 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
11150 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
11160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11170 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
11180 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
11190 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
111a0 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
111b0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
111c0 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
111d0 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
111e0 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
111f0 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
11200 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11210 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11220 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
11230 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11240 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11250 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11260 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11270 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
11280 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
11290 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
112a0 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
112b0 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
112c0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
112d0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
112e0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
112f0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11300 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
11310 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
11320 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11330 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
11340 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11350 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11360 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11370 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
11380 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11390 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
113a0 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
113b0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
113c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
113d0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
113e0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
113f0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
11400 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
11410 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
11420 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
11430 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
11440 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11450 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11460 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11470 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
11480 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
11490 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
114a0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
114b0 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
114c0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
114d0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
114e0 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
114f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11500 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11510 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
11520 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11530 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
11540 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11550 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11560 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11570 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
11580 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
11590 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
115a0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
115b0 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
115c0 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
115d0 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
115e0 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
115f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11600 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11610 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11630 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
11640 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11650 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11660 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11670 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
11680 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
11690 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
116a0 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
116b0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
116c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
116d0 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
116e0 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
116f0 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
11700 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11710 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11720 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
11730 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11740 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11750 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11760 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11770 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11780 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11790 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
117a0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
117b0 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
117c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
117d0 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
117e0 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
117f0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11800 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
11810 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
11820 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11830 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
11840 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11850 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11860 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11870 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11880 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11890 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
118a0 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
118b0 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
118c0 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
118d0 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
118e0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
118f0 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11900 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11910 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11920 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11930 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11940 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11950 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11960 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11970 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11980 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11990 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
119a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
119b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
119c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
119d0 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
119e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
119f0 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11a00 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11a10 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11a20 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11a30 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11a40 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11a50 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11a60 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11a70 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11a80 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11a90 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11aa0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11ab0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11ac0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11ae0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11af0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11b00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11b10 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11b20 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11b30 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11b40 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11b50 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11b70 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11b80 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11b90 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11ba0 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11bb0 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11bc0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11bd0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11be0 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11bf0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11c00 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11c10 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11c20 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11c30 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11c40 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11c50 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11c60 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11c70 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11c80 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
11c90 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
11ca0 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
11cb0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
11cc0 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
11cd0 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
11ce0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11cf0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
11d00 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
11d10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11d20 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11d30 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
11d40 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11d50 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11d60 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
11d70 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11d80 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11d90 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
11da0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
11db0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11dc0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
11dd0 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
11de0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11df0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
11e00 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
11e10 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
11e20 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
11e30 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
11e40 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
11e50 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
11e60 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
11e70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11e80 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11e90 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
11ea0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
11eb0 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
11ec0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
11ed0 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
11ee0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
11ef0 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
11f00 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
11f10 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
11f20 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
11f30 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
11f40 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
11f50 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
11f60 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
11f70 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
11f80 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
11f90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
11fa0 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
11fb0 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
11fc0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11fd0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
11fe0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11ff0 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12000 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
12010 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
12020 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
12030 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
12040 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12050 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12060 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12070 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
12080 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
12090 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
120a0 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
120b0 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
120c0 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
120d0 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
120e0 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
120f0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
12100 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12110 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
12120 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
12130 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
12140 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12150 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12160 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12170 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12180 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
12190 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
121a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
121b0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
121c0 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
121d0 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
121e0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
121f0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12200 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
12210 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
12220 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
12230 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
12240 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12250 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12260 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12270 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
12280 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12290 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
122a0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
122b0 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
122c0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
122d0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
122e0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
122f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
12300 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12310 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12320 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12330 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
12340 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
12350 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12360 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12370 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  lHdr = 0;.  pPag
12380 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
12390 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
123a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
123b0 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20  led whenever an 
123c0 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72  IOERR or FULL er
123d0 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65  ror that require
123e0 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74  s.** the pager t
123f0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74  o transition int
12400 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
12410 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72  e may ahve occur
12420 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  red..** The firs
12430 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
12440 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
12450 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
12460 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74  the second .** t
12470 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
12480 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
12490 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
124a0 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
124b0 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
124c0 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
124d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
124e0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
124f0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
12500 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12510 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55  ent is SQLITE_FU
12520 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
12530 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   or one of the.*
12540 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65  * IOERR sub-code
12550 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  s, the pager ent
12560 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74  ers the ERROR st
12570 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ate and the erro
12580 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f  r code.** is sto
12590 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72  red in Pager.err
125a0 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20  Code. While the 
125b0 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e  pager remains in
125c0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
125d0 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41  ,.** all major A
125e0 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  PI calls on the 
125f0 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
12600 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61  iately return Pa
12610 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a  ger.errCode..**.
12620 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61  ** The ERROR sta
12630 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  te indicates tha
12640 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
12650 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12660 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
12670 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
12680 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
12690 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
126a0 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
126b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
126c0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
126d0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
126e0 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
126f0 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
12700 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
12710 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
12720 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
12730 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
12740 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
12750 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
12760 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12770 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
12780 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
12790 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
127a0 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
127b0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
127c0 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
127d0 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
127e0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
127f0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
12800 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
12810 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
12820 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
12830 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
12840 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12850 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
12860 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
12870 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
12880 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
12890 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
128a0 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
128b0 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
128c0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
128d0 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
128e0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
128f0 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  ER_ERROR;.  }.  
12900 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12910 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12920 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
12930 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
12940 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
12950 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
12960 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
12970 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
12980 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
12990 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
129a0 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
129b0 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
129c0 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
129d0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
129e0 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
129f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
12a00 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
12a10 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
12a20 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
12a30 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
12a40 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  n..** .** This r
12a50 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
12a60 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f  called in PAGER_
12a70 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20  ERROR state. If 
12a80 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  it is called.** 
12a90 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72  in PAGER_NONE or
12aa0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
12ab0 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ate and the lock
12ac0 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a   held is less.**
12ad0 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20   exclusive than 
12ae0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  a RESERVED lock,
12af0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
12b00 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
12b10 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
12b20 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
12b30 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
12b40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
12b50 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
12b60 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
12b70 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
12b80 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
12b90 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
12ba0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
12bb0 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
12bc0 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
12bd0 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
12be0 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
12bf0 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
12c00 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
12c10 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
12c20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12c30 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
12c40 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
12c50 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
12c60 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
12c70 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
12c80 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
12c90 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
12ca0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
12cb0 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
12cc0 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
12cd0 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
12ce0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12cf0 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
12d00 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
12d10 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
12d20 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
12d30 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
12d40 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
12d50 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
12d60 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
12d70 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
12d80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
12d90 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
12da0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
12db0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
12dc0 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
12dd0 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
12de0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
12df0 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
12e00 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
12e10 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
12e20 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
12e30 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
12e40 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
12e50 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
12e60 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
12e70 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
12e80 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
12e90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
12ea0 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12eb0 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
12ec0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12ed0 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
12ee0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
12ef0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
12f00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
12f10 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
12f20 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
12f30 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
12f40 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
12f50 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
12f60 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
12f70 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
12f80 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
12f90 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
12fa0 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
12fb0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
12fc0 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
12fd0 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
12fe0 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
12ff0 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
13000 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
13010 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
13020 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
13030 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  ized, the pager 
13040 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52  moves to PAGER_R
13050 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20  EADER state..** 
13060 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  If running in no
13070 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c  n-exclusive roll
13080 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c  back mode, the l
13090 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
130a0 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65  is .** downgrade
130b0 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f  d to a SHARED_LO
130c0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
130d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
130e0 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
130f0 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
13100 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a  occurs during.**
13110 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f   any of the IO o
13120 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e  perations to fin
13130 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
13140 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b  l file or unlock
13150 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
13160 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
13170 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
13180 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
13190 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72   If the .** oper
131a0 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a  ation to finaliz
131b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
131c0 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  le fails, then t
131d0 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a  he code still.**
131e0 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b   tries to unlock
131f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13200 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63  le if not in exc
13210 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20  lusive mode. If 
13220 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70  the.** unlock op
13230 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73  eration fails as
13240 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   well, then the 
13250 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65  first error code
13260 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74   related.** to t
13270 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65  he first error e
13280 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20  ncountered (the 
13290 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
132a0 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20  tion one) is.** 
132b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
132c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
132d0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
132e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
132f0 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69   hasMaster){.  i
13300 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13310 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  K;      /* Error
13320 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e   code from journ
13330 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
13340 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
13350 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
13360 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  OK;     /* Error
13370 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69   code from db fi
13380 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  le unlock operat
13390 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20  ion */..  /* Do 
133a0 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20 70  nothing if the p
133b0 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
133c0 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
133d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
133e0 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20  * or at least a 
133f0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54  RESERVED lock. T
13400 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
13410 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
13420 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
13430 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
13440 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20 61 20  on active but a 
13450 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
13460 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a  ter lock is.  **
13470 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20   held under two 
13480 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20  circumstances:. 
13490 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66   **.  **   1. Af
134a0 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75 6c  ter a successful
134b0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
134c0 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c  lback, it is cal
134d0 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20  led with.  **   
134e0 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52     eState==PAGER
134f0 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d  _NONE and eLock=
13500 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e  =EXCLUSIVE_LOCK.
13510 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20  .  **.  **   2. 
13520 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  If a connection 
13530 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  with locking_mod
13540 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64  e=exclusive hold
13550 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
13560 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b   .  **      lock
13570 20 73 77 69 74 63 68 65 73 20 62 61 63 6b 20 74   switches back t
13580 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e  o locking_mode=n
13590 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65  ormal and then e
135a0 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20  xecutes a.  **  
135b0 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63      read-transac
135c0 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74  tion, this funct
135d0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ion is called wi
135e0 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52  th eState==PAGER
135f0 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20  _READER .  **   
13600 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58     and eLock==EX
13610 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65  CLUSIVE_LOCK whe
13620 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  n the read-trans
13630 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64  action is closed
13640 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13650 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
13660 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
13670 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13680 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
13690 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50  RROR );.  if( pP
136a0 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
136b0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
136c0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
136d0 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  k<RESERVED_LOCK 
136e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
136f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
13700 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
13710 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ints(pPager);.  
13720 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
13730 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
13740 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13750 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  l==0 );.  if( is
13760 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
13770 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
13780 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
13790 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
137a0 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   Finalize the jo
137b0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
137c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
137d0 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
137e0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
137f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13800 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13810 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13820 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20  MEMORY );.      
13830 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
13840 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
13850 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
13860 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
13870 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13880 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20  E_TRUNCATE ){.  
13890 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
138a0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
138b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
138c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
138d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
138e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
138f0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
13900 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
13910 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
13920 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
13930 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
13940 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13950 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13960 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c  _PERSIST.      |
13970 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
13980 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
13990 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
139a0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
139b0 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20  DE_WAL).    ){. 
139c0 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f       rc = zeroJo
139d0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
139e0 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20   hasMaster);.   
139f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13a00 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
13a10 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
13a20 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62  his branch may b
13a30 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20  e executed with 
13a40 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
13a50 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20  e==MEMORY if.   
13a60 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72     ** a hot-jour
13a70 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c  nal was just rol
13a80 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69  led back. In thi
13a90 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
13aa0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  al.      ** file
13ab0 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
13ac0 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49  d and deleted. I
13ad0 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
13ae0 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20  n writes to.    
13af0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
13b00 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20  e file, it will 
13b10 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69  do so using an i
13b20 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
13b30 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
13b40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13b50 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13b60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13b70 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20  _DELETE .       
13b80 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
13b90 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13ba0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
13bb0 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20  MORY .          
13bc0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
13bd0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13be0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
13bf0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
13c00 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
13c10 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
13c20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
13c30 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
13c40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13c50 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
13c60 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
13c70 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
13c80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
13c90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
13ca0 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74  CK_PAGES.  sqlit
13cb0 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
13cc0 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
13cd0 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
13ce0 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28  pagehash);.  if(
13cf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
13d00 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61  =0 && sqlite3Pca
13d10 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
13d20 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
13d30 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
13d40 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
13d50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  ager, 1);.    if
13d60 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ( p ){.      p->
13d70 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20  pageHash = 0;.  
13d80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
13d90 55 6e 72 65 66 28 70 29 3b 0a 20 20 20 20 7d 0a  Unref(p);.    }.
13da0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
13db0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
13dc0 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
13dd0 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
13de0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
13df0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
13e00 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
13e10 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
13e20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
13e30 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54    sqlite3PcacheT
13e40 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
13e50 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d  pPCache, pPager-
13e60 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  >dbSize);..  if(
13e70 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
13e80 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ger) ){.    /* D
13e90 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74  rop the WAL writ
13ea0 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20  e-lock, if any. 
13eb0 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e  Also, if the con
13ec0 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a  nection was in .
13ed0 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d      ** locking_m
13ee0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
13ef0 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e  de but is no lon
13f00 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58  ger, drop the EX
13f10 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20  CLUSIVE .    ** 
13f20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
13f30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
13f40 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d      */.    rc2 =
13f50 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72   sqlite3WalEndWr
13f60 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
13f70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
13f80 20 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53    assert( rc2==S
13f90 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
13fa0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
13fb0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
13fc0 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61   && (!pagerUseWa
13fd0 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c  l(pPager) || sql
13fe0 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
13ff0 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
14000 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20  l, 0)).  ){.    
14010 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63  rc2 = pagerUnloc
14020 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
14030 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
14040 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
14050 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  tDone = 0;.  }. 
14060 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
14070 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
14080 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
14090 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  ter = 0;..  retu
140a0 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
140b0 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
140c0 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
140d0 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
140e0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
140f0 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
14100 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
14110 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
14120 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
14130 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
14140 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20  ERROR state, do 
14150 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
14160 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
14170 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
14180 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
14190 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
141a0 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
141b0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
141c0 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
141d0 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
141e0 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
141f0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f  base file and mo
14200 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63  ve the pager bac
14210 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
14220 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61   If this .** mea
14230 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
14240 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c   a hot-journal l
14250 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
14260 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74  system, the next
14270 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
14280 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
14290 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  ed lock on the p
142a0 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20  ager (which may 
142b0 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a  be this one) .**
142c0 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61   will roll it ba
142d0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
142e0 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
142f0 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
14300 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
14310 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
14320 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
14330 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
14340 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
14350 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
14360 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
14370 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
14380 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68  ROR state. Which
14390 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
143a0 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
143b0 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
143c0 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
143d0 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
143e0 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
143f0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
14400 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14410 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
14420 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
14430 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
14440 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  !=PAGER_OPEN ){.
14450 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
14460 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
14470 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66  Pager) );.    if
14480 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14490 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
144a0 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73  OCKED ){.      s
144b0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
144c0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
144d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
144e0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
144f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
14500 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14510 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
14520 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14530 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ode ){.      ass
14540 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
14550 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
14560 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  R );.      pager
14570 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
14580 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
14590 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75   }.  }.  pager_u
145a0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
145b0 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
145c0 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69  r aData must poi
145d0 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
145e0 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  f pPager->pageSi
145f0 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  ze bytes.** of d
14600 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64  ata. Compute and
14610 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
14620 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65  um based ont the
14630 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
14640 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74   .** page of dat
14650 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  a and the curren
14660 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65  t value of pPage
14670 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a  r->cksumInit..**
14680 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
14690 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
146a0 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
146b0 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
146c0 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
146d0 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67  tial value (pPag
146e0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61  er->cksumInit) a
146f0 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62  nd every 200th b
14700 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  yte.** of the pa
14710 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e  ge data, startin
14720 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73  g with byte offs
14730 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  et (pPager->page
14740 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61  Size%200)..** Ea
14750 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
14760 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62  preted as an 8-b
14770 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  it unsigned inte
14780 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  ger..**.** Chang
14790 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20  ing the formula 
147a0 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
147b0 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65  this checksum re
147c0 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69  sults in an.** i
147d0 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72  ncompatible jour
147e0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  nal file format.
147f0 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61  .**.** If journa
14800 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  l corruption occ
14810 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
14820 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
14830 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20  most likely .** 
14840 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74  scenario is that
14850 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
14860 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
14870 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
14880 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d  ged. .** It is m
14890 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
148a0 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
148b0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
148c0 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
148d0 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
148e0 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
148f0 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
14900 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
14910 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
14920 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
14930 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
14940 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
14950 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  f corruption..*/
14960 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
14970 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
14980 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
14990 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
149a0 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
149b0 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
149c0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61    /* Checksum va
149d0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
149e0 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
149f0 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
14a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
14a10 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77  p counter */.  w
14a20 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20  hile( i>0 ){.   
14a30 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b   cksum += aData[
14a40 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30  i];.    i -= 200
14a50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
14a60 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ksum;.}../*.** R
14a70 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e  eport the curren
14a80 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
14a90 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
14aa0 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a  ed bytes back.**
14ab0 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a   to the codec..*
14ac0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
14ad0 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63  HAS_CODEC.static
14ae0 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72   void pagerRepor
14af0 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  tSize(Pager *pPa
14b00 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
14b10 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
14b20 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ng ){.    pPager
14b30 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
14b40 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c  (pPager->pCodec,
14b50 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
14b60 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
14b80 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  nt)pPager->nRese
14b90 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  rve);.  }.}.#els
14ba0 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
14bb0 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20  ReportSize(X)   
14bc0 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65    /* No-op if we
14bd0 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
14be0 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69  a codec */.#endi
14bf0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
14c00 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
14c10 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
14c20 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
14c30 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
14c40 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
14c50 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
14c60 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
14c70 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
14c80 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
14c90 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
14ca0 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
14cb0 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
14cc0 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
14cd0 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
14ce0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
14cf0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
14d00 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
14d10 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
14d20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65  journal uses che
14d30 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
14d40 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
14d50 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a  oes .** not..**.
14d60 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
14d70 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
14d80 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
14d90 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
14da0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
14db0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
14dc0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
14dd0 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
14de0 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
14df0 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
14e00 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
14e10 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
14e20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
14e30 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
14e40 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
14e50 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
14e60 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
14e70 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
14e80 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
14e90 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
14ea0 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
14eb0 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
14ec0 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
14ed0 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
14ee0 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
14ef0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
14f00 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
14f10 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
14f20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
14f30 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
14f40 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
14f50 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
14f60 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
14f70 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
14f80 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
14f90 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
14fa0 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
14fb0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
14fc0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
14fd0 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
14fe0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
14ff0 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
15000 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
15010 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
15020 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
15030 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
15040 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
15050 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
15060 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
15070 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
15080 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
15090 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
150a0 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
150b0 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
150c0 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
150d0 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
150e0 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
150f0 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
15100 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
15110 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
15120 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
15130 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
15140 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
15150 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
15160 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
15170 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
15180 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
15190 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
151a0 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
151b0 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
151c0 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
151d0 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
151e0 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
151f0 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
15200 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
15210 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
15220 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
15230 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
15240 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15250 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
15260 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
15270 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
15280 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
15290 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
152a0 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
152b0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
152c0 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
152d0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
152e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
152f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
15300 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
15310 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
15320 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15330 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
15340 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34  ed back */.  i64
15350 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
15360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
15370 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
15380 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
15390 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20  Bitvec *pDone,  
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
153b0 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
153c0 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
153d0 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73  back */.  int is
153e0 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20  MainJrnl,       
153f0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20          /* 1 -> 
15400 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20  main journal. 0 
15410 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  -> sub-journal. 
15420 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
15430 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
15440 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
15450 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
15460 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ack */.){.  int 
15470 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
15480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15490 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
154a0 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
154b0 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
154c0 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
154d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
154e0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
154f0 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
15500 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
15530 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
15540 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61  hecking */.  cha
15550 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  r *aData;       
15560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
15570 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
15580 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
15590 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
155a0 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  jfd;            
155b0 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
155c0 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  riptor for the j
155d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
155e0 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20   int isSynced;  
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15600 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
15610 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65 64  l page is synced
15620 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
15630 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
15640 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
15650 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
15660 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
15670 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
15680 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
15690 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
156a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
156b0 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
156c0 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
156d0 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
156e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
156f0 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
15700 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
15710 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
15720 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
15730 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
15740 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d   aData = pPager-
15750 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73  >pTmpSpace;.  as
15760 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20  sert( aData );  
15770 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
15780 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65  torage must have
15790 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
157a0 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73  located */.  ass
157b0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
157c0 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28  (pPager)==0 || (
157d0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69  !isMainJrnl && i
157e0 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20  sSavepnt) );..  
157f0 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74  /* Either the st
15800 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ate is greater t
15810 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52  han PAGER_WRITER
15820 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61  _CACHEMOD (a tra
15830 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
15840 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  r savepoint roll
15850 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65  back done at the
15860 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20   request of the 
15870 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20  caller) or this 
15880 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  is.  ** a hot-jo
15890 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
158a0 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a  If it is a hot-j
158b0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
158c0 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
158d0 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e  is in state OPEN
158e0 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58   and holds an EX
158f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f  CLUSIVE lock. Ho
15900 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
15910 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61  ck.  ** only rea
15920 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
15930 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68   journal, not th
15940 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
15950 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
15960 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
15970 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
15980 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  MOD.       || (p
15990 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
159a0 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61  AGER_OPEN && pPa
159b0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
159c0 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
159d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
159e0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
159f0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15a00 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29   || isMainJrnl )
15a10 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
15a20 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
15a30 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20   page data from 
15a40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  the journal or s
15a50 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  ub-journal.  ** 
15a60 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20  file. Return an 
15a70 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
15a80 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49  e caller if an I
15a90 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  O error occurs..
15aa0 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d    */.  jfd = isM
15ab0 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
15ac0 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
15ad0 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61  sjfd;.  rc = rea
15ae0 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f  d32bits(jfd, *pO
15af0 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
15b00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15b10 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
15b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15b30 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61  Read(jfd, (u8*)a
15b40 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
15b50 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
15b60 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
15b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
15b80 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
15b90 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
15ba0 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
15bb0 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
15bc0 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
15bd0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
15be0 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
15bf0 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
15c00 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
15c10 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
15c20 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
15c30 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
15c40 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
15c50 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
15c60 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
15c70 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
15c80 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
15c90 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
15ca0 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
15cb0 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
15cc0 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
15cd0 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
15ce0 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
15cf0 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
15d00 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
15d10 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
15d20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
15d30 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
15d40 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
15d50 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
15d60 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
15d70 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
15d80 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
15d90 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
15da0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15db0 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
15dc0 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
15dd0 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
15de0 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
15df0 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
15e00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
15e10 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
15e20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
15e30 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74  Pager, (u8*)aDat
15e40 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
15e50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15e60 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
15e70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
15e80 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
15e90 62 65 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62  been played by b
15ea0 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65  efore during the
15eb0 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f   current.  ** ro
15ec0 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e  llback, then don
15ed0 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61  't bother to pla
15ee0 79 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e  y it back again.
15ef0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e  .  */.  if( pDon
15f00 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
15f10 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e  e3BitvecSet(pDon
15f20 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54  e, pgno))!=SQLIT
15f30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
15f40 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
15f50 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61   When playing ba
15f60 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f  ck page 1, resto
15f70 72 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20  re the nReserve 
15f80 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69  setting.  */.  i
15f90 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  f( pgno==1 && pP
15fa0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d  ager->nReserve!=
15fb0 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
15fc0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
15fd0 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a  nReserve = ((u8*
15fe0 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20  )aData)[20];.   
15ff0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16000 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
16010 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
16020 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20   is in CACHEMOD 
16030 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
16040 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
16050 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
16060 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
16070 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
16080 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
16090 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
160a0 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
160b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
160c0 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
160d0 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
160e0 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
160f0 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  ** An exception 
16100 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c  to the above rul
16110 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e: If the databa
16120 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  se is in no-sync
16130 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61   mode.  ** and a
16140 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64   page is moved d
16150 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  uring an increme
16160 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e  ntal vacuum then
16170 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20   the page may.  
16180 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ** not be in the
16190 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61   pager cache. La
161a0 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63  ter: if a malloc
161b0 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f  () or IO error o
161c0 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
161d0 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63  g a Movepage() c
161e0 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61  all, then the pa
161f0 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ge may not be in
16200 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20   the cache.  ** 
16210 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63  either. So the c
16220 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
16230 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  ed in the above 
16240 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74  paragraph is not
16250 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62  .  ** assert()ab
16260 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
16270 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44   in WRITER_DBMOD
16280 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  , WRITER_FINISHE
16290 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c  D or OPEN state,
162a0 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
162b0 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63  the.  ** pager c
162c0 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
162d0 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  s and the main f
162e0 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
162f0 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20   then marked .  
16300 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69  ** not dirty. Si
16310 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73  nce this code is
16320 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69   only executed i
16330 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
16340 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f  te for.  ** a ho
16350 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
16360 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  ck, it is guaran
16370 74 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61  teed that the pa
16380 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74  ge-cache is empt
16390 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61  y.  ** if the pa
163a0 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73  ger is in OPEN s
163b0 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tate..  **.  ** 
163c0 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
163d0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
163e0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
163f0 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
16400 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
16410 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
16420 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
16430 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
16440 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
16450 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
16460 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
16470 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
16480 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
16490 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
164a0 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
164b0 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
164c0 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
164d0 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
164e0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
164f0 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
16500 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
16510 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
16520 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
16530 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
16540 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
16550 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
16560 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
16570 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
16580 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
16590 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
165a0 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
165b0 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
165c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
165d0 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
165e0 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
165f0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
16600 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
16610 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
16620 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
16630 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
16640 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
16650 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
16660 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
16670 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
16680 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
16690 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
166a0 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
166b0 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
166c0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
166d0 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
166e0 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
166f0 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
16700 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
16710 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
16720 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
16730 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
16740 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
16750 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
16760 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
16770 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
16780 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
16790 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
167a0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
167b0 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
167c0 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
167d0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
167e0 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
167f0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
16800 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
16810 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
16820 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
16830 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  /.  if( pagerUse
16840 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
16850 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
16860 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  lse{.    pPg = p
16870 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
16880 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  er, pgno);.  }. 
16890 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20   assert( pPg || 
168a0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
168b0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
168c0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te!=PAGER_OPEN |
168d0 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41  | pPg==0 );.  PA
168e0 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
168f0 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
16900 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
16910 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
16920 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
16930 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
16940 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
16950 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
16960 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
16970 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
16980 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
16990 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
169a0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
169b0 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70      isSynced = p
169c0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
169d0 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50   (*pOffset <= pP
169e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
169f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16a00 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d  isSynced = (pPg=
16a10 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
16a20 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
16a30 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20  D_SYNC));.  }.  
16a40 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
16a50 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50  r->fd).   && (pP
16a60 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
16a70 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
16a80 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
16a90 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
16aa0 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20     && isSynced. 
16ab0 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
16ac0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
16ad0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
16ae0 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
16af0 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
16b00 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66  Pg!=0 && (pPg->f
16b10 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
16b20 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20  SYNC)!=0 );.    
16b30 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
16b40 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
16b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16b60 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
16b70 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  fd, (u8*)aData, 
16b80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16b90 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
16ba0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
16bb0 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
16bc0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
16bd0 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
16be0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
16bf0 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20  r->pBackup ){.  
16c00 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
16c10 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
16c20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
16c30 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EM);.      sqlit
16c40 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
16c50 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
16c60 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61  pgno, (u8*)aData
16c70 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  );.      CODEC2(
16c80 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
16c90 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54  gno, 7, rc=SQLIT
16ca0 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b  E_NOMEM, aData);
16cb0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
16cc0 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
16cd0 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
16ce0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
16cf0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
16d00 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
16d10 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
16d20 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
16d30 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
16d40 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
16d50 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
16d60 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
16d70 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
16d80 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
16d90 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
16da0 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
16db0 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
16dc0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
16dd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
16de0 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
16df0 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
16e00 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
16e10 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
16e20 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
16e30 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
16e40 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
16e50 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
16e60 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
16e70 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
16e80 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
16e90 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
16ea0 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
16eb0 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
16ec0 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
16ed0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
16ee0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
16ef0 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
16f00 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
16f10 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
16f20 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
16f30 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
16f40 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
16f50 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
16f60 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
16f70 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
16f80 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
16f90 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
16fa0 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
16fb0 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
16fc0 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
16fd0 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
16fe0 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
16ff0 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
17000 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
17010 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
17020 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
17030 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
17040 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
17050 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
17060 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17070 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d  er->doNotSpill==
17080 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
17090 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20  >doNotSpill++;. 
170a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
170b0 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
170c0 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
170d0 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
170e0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
170f0 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  ll==1 );.    pPa
17100 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d  ger->doNotSpill-
17110 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  -;.    if( rc!=S
17120 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
17130 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66  n rc;.    pPg->f
17140 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
17150 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71  EED_READ;.    sq
17160 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
17170 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20  irty(pPg);.  }. 
17180 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
17190 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
171a0 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
171b0 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
171c0 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
171d0 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
171e0 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
171f0 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
17200 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
17210 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
17220 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
17230 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
17240 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
17250 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
17260 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
17270 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
17280 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
17290 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
172a0 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
172b0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
172c0 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
172d0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
172e0 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d      pData = pPg-
172f0 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63  >pData;.    memc
17300 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61  py(pData, (u8*)a
17310 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
17320 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  geSize);.    pPa
17330 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
17340 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d  Pg);.    if( isM
17350 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53  ainJrnl && (!isS
17360 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73  avepnt || *pOffs
17370 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  et<=pPager->jour
17380 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20  nalHdr) ){.     
17390 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65   /* If the conte
173a0 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
173b0 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f   were just resto
173c0 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  red from the mai
173d0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  n .      ** jour
173e0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
173f0 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20  ts content must 
17400 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20  be as they were 
17410 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  when the .      
17420 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
17430 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
17440 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
17450 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61   can mark the pa
17460 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63  ge.      ** as c
17470 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72  lean, since ther
17480 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65  e will be no nee
17490 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75  d to write it ou
174a0 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
174b0 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
174c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
174d0 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
174e0 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
174f0 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
17500 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
17510 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
17520 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
17530 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
17540 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
17550 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
17560 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
17570 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
17580 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
17590 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
175a0 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
175b0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
175c0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
175d0 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
175e0 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
175f0 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
17600 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
17610 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
17620 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
17630 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
17640 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
17650 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
17660 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
17670 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
17680 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
17690 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
176a0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
176b0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
176c0 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
176d0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
176e0 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
176f0 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
17700 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
17710 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17720 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
17730 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
17740 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
17750 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
17760 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
17770 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
17780 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
17790 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
177a0 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
177b0 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
177c0 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
177d0 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
177e0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
177f0 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
17800 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
17810 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
17820 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
17830 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
17840 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
17850 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pPg);.    }.  
17860 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
17870 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20  hash(pPg);..    
17880 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
17890 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
178a0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
178b0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
178c0 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
178d0 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
178e0 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
178f0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
17900 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
17910 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
17920 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
17930 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
17940 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
17950 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
17960 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
17970 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
17980 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
17990 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
179a0 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  ->pgno, 3, rc=SQ
179b0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
179c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
179d0 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
179e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
179f0 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
17a00 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
17a10 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
17a20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
17a30 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
17a40 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
17a50 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
17a60 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
17a70 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
17a80 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
17a90 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
17aa0 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
17ab0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
17ac0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
17ad0 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
17ae0 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
17af0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
17b00 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
17b10 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
17b20 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
17b30 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
17b40 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
17b50 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
17b60 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
17b70 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
17b80 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
17b90 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
17ba0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
17bb0 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
17bc0 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
17bd0 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
17be0 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
17bf0 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
17c00 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
17c10 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
17c20 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
17c30 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
17c40 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
17c50 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
17c60 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
17c70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
17c80 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
17c90 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
17ca0 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
17cb0 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
17cc0 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
17cd0 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
17ce0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
17cf0 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
17d00 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
17d10 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
17d20 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
17d30 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
17d40 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
17d50 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
17d60 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
17d70 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
17d80 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
17d90 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17da0 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
17db0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
17dc0 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
17dd0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
17de0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
17df0 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
17e00 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
17e10 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
17e20 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
17e30 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
17e40 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
17e50 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
17e60 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
17e70 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
17e80 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
17e90 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
17ea0 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
17eb0 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
17ec0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
17ed0 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
17ee0 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
17ef0 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
17f00 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
17f10 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
17f20 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
17f30 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
17f40 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
17f50 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
17f60 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
17f70 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
17f80 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
17f90 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
17fa0 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
17fb0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
17fc0 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
17fd0 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
17fe0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
17ff0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
18000 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
18010 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
18020 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
18030 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
18040 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
18050 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
18060 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
18070 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
18080 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
18090 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
180a0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
180b0 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
180c0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
180d0 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
180e0 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
180f0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
18100 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
18110 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18120 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
18130 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
18140 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
18150 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
18160 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
18170 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
18180 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
18190 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
181a0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
181b0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
181c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
181d0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
181e0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18200 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
18210 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
18220 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
18230 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
18240 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
18250 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
18260 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
18270 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
18280 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
18290 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
182a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
182b0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
182c0 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
182d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
182e0 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
182f0 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
18300 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
18310 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18320 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
18330 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
18340 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e  /* Pointer to on
18350 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e  e journal within
18360 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   MJ file */.  ch
18370 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20  ar *zMasterPtr; 
18380 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
18390 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65   to hold MJ file
183a0 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72  name from a jour
183b0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
183c0 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20  t nMasterPtr;   
183d0 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e          /* Amoun
183e0 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  t of space alloc
183f0 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50  ated to zMasterP
18400 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tr[] */..  /* Al
18410 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
18420 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
18430 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
18440 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
18450 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
18460 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
18470 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18480 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
18490 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
184a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
184b0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
184c0 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
184d0 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
184e0 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
184f0 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
18500 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
18510 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
18520 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
18530 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18540 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
18550 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
18560 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
18570 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
18580 4f 4e 0a 20 20 20 20 20 20 28 70 50 61 67 65 72  ON.      (pPager
18590 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54  ->vfsFlags&SQLIT
185a0 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45  E_OPEN_FILEPROTE
185b0 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e  CTION_MASK)|.#en
185c0 64 69 66 0a 20 20 20 20 20 20 28 53 51 4c 49 54  dif.      (SQLIT
185d0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
185e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
185f0 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
18600 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
18610 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
18620 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
18630 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
18640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18650 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18660 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  out;..  /* Load 
18670 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
18680 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
18690 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
186a0 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c  ed from.  ** sql
186b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
186c0 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
186d0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
186e0 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20    Also obtain.  
186f0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ** sufficient sp
18700 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50  ace (in zMasterP
18710 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  tr) to hold the 
18720 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a  names of master.
18730 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
18740 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
18750 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61  m regular rollba
18760 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ck-journals..  *
18770 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
18780 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
18790 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
187a0 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
187b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
187c0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
187d0 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70    nMasterPtr = p
187e0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
187f0 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  1;.  zMasterJour
18800 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
18810 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72  loc((int)nMaster
18820 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
18830 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28  rPtr + 1);.  if(
18840 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
18850 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
18860 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
18870 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18880 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  t;.  }.  zMaster
18890 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f  Ptr = &zMasterJo
188a0 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
188b0 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20  rnal+1];.  rc = 
188c0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
188d0 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
188e0 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73  urnal, (int)nMas
188f0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
18900 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18910 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
18920 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73  ster_out;.  zMas
18930 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
18940 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
18950 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d  .  zJournal = zM
18960 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
18970 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
18980 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
18990 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
189a0 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74  ){.    int exist
189b0 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  s;.    rc = sqli
189c0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
189d0 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
189e0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
189f0 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
18a00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18a10 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
18a20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
18a30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69     }.    if( exi
18a40 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  sts ){.      /* 
18a50 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
18a60 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
18a70 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
18a80 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
18a90 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
18aa0 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
18ab0 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
18ac0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
18ad0 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
18ae0 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
18af0 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
18b00 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
18b10 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
18b20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  c;.      int fla
18b30 67 73 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45  gs = .#if SQLITE
18b40 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
18b50 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20  TECTION.        
18b60 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67  (pPager->vfsFlag
18b70 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49  s&SQLITE_OPEN_FI
18b80 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53  LEPROTECTION_MAS
18b90 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  K)|.#endif.     
18ba0 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
18bb0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18bc0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
18bd0 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
18be0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18bf0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
18c00 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
18c10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18c20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18c30 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18c40 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18c50 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
18c60 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
18c70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
18c80 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
18c90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
18ca0 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
18cb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18cc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18cd0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18ce0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18cf0 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
18d00 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
18d10 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
18d20 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
18d30 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
18d40 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
18d50 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
18d60 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
18d70 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18d80 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
18d90 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18db0 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
18dc0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18dd0 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
18de0 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
18df0 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
18e00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
18e10 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
18e20 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
18e30 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
18e40 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
18e50 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
18e60 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
18e70 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
18e80 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
18e90 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
18ea0 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
18eb0 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
18ec0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18ed0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
18ee0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
18ef0 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
18f00 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
18f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
18f20 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
18f30 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
18f40 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
18f50 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
18f60 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
18f70 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
18f80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
18f90 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
18fa0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
18fb0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
18fc0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
18fd0 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
18fe0 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
18ff0 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
19000 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
19010 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
19020 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
19030 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
19040 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
19050 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
19060 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
19070 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
19080 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
19090 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
190a0 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
190b0 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
190c0 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
190d0 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
190e0 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
190f0 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
19100 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
19110 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
19120 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
19130 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
19140 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
19150 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
19160 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
19170 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
19180 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
19190 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
191a0 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
191b0 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
191c0 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
191d0 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
191e0 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
191f0 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
19200 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
19210 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
19220 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
19230 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
19240 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
19250 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
19260 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
19270 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
19280 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
19290 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
192a0 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
192b0 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
192c0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
192d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
192e0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
192f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19300 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
19310 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19320 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19330 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
19340 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
19350 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19360 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
19370 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
19380 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
19390 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
193a0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
193b0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
193c0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
193d0 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
193e0 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
193f0 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
19400 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
19410 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
19420 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19430 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
19440 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
19450 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19460 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19470 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19480 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
19490 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
194a0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
194b0 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
194c0 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
194d0 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
194e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
194f0 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
19500 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
19510 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
19520 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
19530 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19540 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
19550 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19560 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
19570 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
19580 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Tmp = pPager->pT
19590 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20  mpSpace;.       
195a0 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c   memset(pTmp, 0,
195b0 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20   szPage);.      
195c0 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
195d0 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3c 20 20  Size-szPage) <  
195e0 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
195f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19600 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
19610 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65  ) == currentSize
19620 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
19630 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
19640 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e  zPage) >  curren
19650 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
19660 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
19670 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
19680 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e   pTmp, szPage, n
19690 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a  ewSize-szPage);.
196a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
196b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
196c0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
196d0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
196e0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nPage;.      }. 
196f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19700 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
19710 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
19720 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
19730 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
19740 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
19750 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
19760 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
19770 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
19780 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
19790 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
197a0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
197b0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
197c0 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74   used used .** t
197d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
197e0 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65  size and alignme
197f0 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  nt of journal he
19800 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73  ader and .** mas
19810 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
19820 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61  ters within crea
19830 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ted journal file
19840 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
19850 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65  porary files the
19860 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
19870 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73  r size is always
19880 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a   512 bytes..**.*
19890 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  * Otherwise, for
198a0 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66   non-temporary f
198b0 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74  iles, the effect
198c0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
198d0 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  is.** the value 
198e0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
198f0 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65  xSectorSize() me
19900 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20  thod rounded up 
19910 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69  to 32 if.** it i
19920 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20  s less than 32, 
19930 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20  or rounded down 
19940 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  to MAX_SECTOR_SI
19950 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67  ZE if it.** is g
19960 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f  reater than MAX_
19970 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a  SECTOR_SIZE..*/.
19980 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
19990 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
199a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
199b0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
199c0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
199d0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
199e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
199f0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  mpFile ){.    /*
19a00 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
19a10 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
19a20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
19a30 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
19a40 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
19a50 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
19a60 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61  yet, in which ca
19a70 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
19a80 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
19a90 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
19aa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
19ab0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
19ac0 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
19ad0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
19ae0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
19af0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33  er->sectorSize<3
19b00 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  2 ){.    pPager-
19b10 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31  >sectorSize = 51
19b20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  2;.  }.  if( pPa
19b30 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
19b40 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
19b50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  ){.    assert( M
19b60 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d  AX_SECTOR_SIZE>=
19b70 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67 65  512 );.    pPage
19b80 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
19b90 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  MAX_SECTOR_SIZE;
19ba0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
19bb0 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
19bc0 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
19bd0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
19be0 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
19bf0 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
19c00 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
19c10 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
19c20 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
19c30 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
19c40 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
19c50 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
19c60 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
19c70 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
19c80 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
19c90 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
19ca0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
19cb0 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
19cc0 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
19cd0 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
19ce0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
19cf0 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
19d00 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
19d10 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
19d20 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
19d30 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
19d40 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
19d50 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
19d60 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
19d70 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19d80 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
19d90 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
19da0 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
19db0 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
19dc0 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
19dd0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
19de0 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
19df0 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
19e00 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
19e10 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
19e20 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
19e30 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
19e40 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19e50 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
19e60 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
19e70 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
19e80 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
19e90 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
19ea0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
19eb0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
19ec0 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
19ed0 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
19ee0 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
19ef0 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
19f00 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
19f10 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
19f20 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
19f30 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
19f40 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
19f50 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
19f60 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
19f70 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
19f80 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
19f90 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
19fa0 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
19fb0 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
19fc0 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
19fd0 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
19fe0 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
19ff0 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
1a000 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
1a010 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1a020 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
1a030 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
1a040 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1a050 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
1a060 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
1a070 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
1a080 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
1a090 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
1a0a0 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
1a0b0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
1a0c0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
1a0d0 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
1a0e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1a0f0 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
1a100 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
1a110 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
1a120 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1a130 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
1a140 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
1a150 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
1a160 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1a170 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
1a180 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
1a190 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
1a1a0 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
1a1b0 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
1a1c0 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
1a1d0 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
1a1e0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1a1f0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
1a200 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1a210 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
1a220 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
1a230 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
1a240 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
1a250 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
1a260 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
1a270 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
1a280 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
1a290 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
1a2a0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1a2b0 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1a2c0 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
1a2d0 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
1a2e0 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
1a2f0 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
1a300 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
1a310 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
1a320 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1a330 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
1a340 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
1a350 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
1a360 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
1a370 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
1a380 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
1a390 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
1a3a0 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
1a3b0 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
1a3c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1a3d0 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
1a3e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1a3f0 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
1a400 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
1a410 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
1a420 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
1a430 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
1a440 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
1a450 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
1a460 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1a470 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1a480 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
1a490 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
1a4a0 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
1a4b0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1a4c0 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
1a4d0 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
1a4e0 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
1a4f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1a500 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
1a510 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1a520 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
1a530 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
1a540 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1a550 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
1a560 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
1a570 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1a580 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
1a590 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
1a5a0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
1a5b0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
1a5c0 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
1a5d0 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1a5e0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1a5f0 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
1a600 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
1a610 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
1a620 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
1a630 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
1a640 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
1a650 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
1a660 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
1a670 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
1a680 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
1a690 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
1a6a0 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
1a6b0 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
1a6c0 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
1a6d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1a6e0 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
1a6f0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
1a700 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
1a710 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1a720 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
1a730 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1a740 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1a750 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a760 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1a770 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
1a780 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a790 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
1a7a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1a7b0 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
1a7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1a7d0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1a7e0 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
1a7f0 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1a800 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1a810 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
1a820 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
1a830 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1a840 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1a850 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
1a860 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1a870 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
1a880 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1a890 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1a8a0 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
1a8b0 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
1a8c0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
1a8d0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
1a8e0 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
1a8f0 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
1a900 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
1a910 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
1a920 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
1a930 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
1a940 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
1a950 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
1a960 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
1a970 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
1a980 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
1a990 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
1a9a0 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
1a9b0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1a9c0 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20  >jfd) );.  rc = 
1a9d0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1a9e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1a9f0 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
1aa00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aa10 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1aa20 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
1aa30 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
1aa40 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
1aa50 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
1aa60 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
1aa70 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
1aa80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1aa90 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
1aaa0 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
1aab0 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
1aac0 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
1aad0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
1aae0 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
1aaf0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
1ab00 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
1ab10 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
1ab20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  Technically the 
1ab30 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20  following is an 
1ab40 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74  error because it
1ab50 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20   assumes that.  
1ab60 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e  ** buffer Pager.
1ab70 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78  pTmpSpace is (mx
1ab80 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65  Pathname+1) byte
1ab90 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65  s or larger. i.e
1aba0 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61  . that.  ** (pPa
1abb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d  ger->pageSize >=
1abc0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1abd0 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73  xPathname+1). Us
1abe0 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20  ing os_unix.c,. 
1abf0 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20   **  mxPathname 
1ac00 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73  is 512, which is
1ac10 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1ac20 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62   minimum allowab
1ac30 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f  le value.  ** fo
1ac40 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f  r pageSize..  */
1ac50 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
1ac60 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1ac70 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1ac80 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1ac90 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1aca0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1acb0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66  athname+1);.  if
1acc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1acd0 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b  && zMaster[0] ){
1ace0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1acf0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1ad00 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
1ad10 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1ad20 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  res);.  }.  zMas
1ad30 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ter = 0;.  if( r
1ad40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1ad50 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !res ){.    goto
1ad60 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1ad70 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
1ad80 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e  rnalOff = 0;.  n
1ad90 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1ada0 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69  isHot;..  /* Thi
1adb0 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
1adc0 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20  s either when a 
1add0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
1ade0 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f   or .  ** pager_
1adf0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1ae00 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  e() call returns
1ae10 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
1ae20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a  an IO error .  *
1ae30 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a  * occurs. .  */.
1ae40 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1ae50 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
1ae60 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
1ae70 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
1ae80 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
1ae90 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
1aea0 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
1aeb0 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
1aec0 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
1aed0 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
1aee0 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
1aef0 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
1af00 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61   process must ha
1af10 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ve failed while 
1af20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
1af30 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
1af40 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
1af50 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
1af60 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
1af70 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
1af80 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69  nalHdr(pPager, i
1af90 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  sHot, szJ, &nRec
1afa0 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
1afb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1afc0 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
1afd0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1afe0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1aff0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1b000 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
1b010 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
1b020 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1b030 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1b040 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
1b050 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1b060 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
1b070 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
1b080 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
1b090 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
1b0a0 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
1b0b0 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
1b0c0 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
1b0d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
1b0e0 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
1b0f0 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
1b100 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1b110 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
1b120 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
1b130 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1b140 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
1b150 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b160 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b170 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1b180 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
1b190 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
1b1a0 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f  ((szJ - JOURNAL_
1b1b0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
1b1c0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1b1d0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1b1e0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1b1f0 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
1b200 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
1b210 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
1b220 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
1b230 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
1b240 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
1b250 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
1b260 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
1b270 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
1b280 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
1b290 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1b2a0 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
1b2b0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1b2c0 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
1b2d0 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
1b2e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1b2f0 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
1b300 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
1b310 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
1b320 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1b330 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
1b340 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
1b350 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
1b360 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
1b370 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67   ** When rolling
1b380 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72   back a hot jour
1b390 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77  nal, nRec==0 alw
1b3a0 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ays means that t
1b3b0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63  he next.    ** c
1b3c0 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  hunk of the jour
1b3d0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  nal contains zer
1b3e0 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f  o pages to be ro
1b3f0 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a  lled back.  But.
1b400 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e      ** when doin
1b410 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  g a ROLLBACK and
1b420 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75   the nRec==0 chu
1b430 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  nk is the last c
1b440 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74  hunk in.    ** t
1b450 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d  he journal, it m
1b460 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f  eans that the jo
1b470 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
1b480 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20  ain additional. 
1b490 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74     ** pages that
1b4a0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c   need to be roll
1b4b0 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ed back and that
1b4c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1b4d0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f  ages .    ** sho
1b4e0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
1b4f0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  based on the jou
1b500 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a  rnal file size..
1b510 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1b520 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
1b530 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
1b540 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
1b550 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1b560 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
1b570 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
1b580 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1b590 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
1b5a0 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
1b5b0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1b5c0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1b5d0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1b5e0 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
1b5f0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
1b600 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
1b610 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
1b620 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
1b630 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
1b640 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1b650 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1b660 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1b670 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
1b680 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1b690 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
1b6a0 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
1b6b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1b6d0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1b6e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1b6f0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
1b700 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  Pg;.    }..    /
1b710 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
1b720 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
1b730 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
1b740 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  k into the .    
1b750 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1b760 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63   and/or page cac
1b770 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  he..    */.    f
1b780 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
1b790 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  u++){.      if( 
1b7a0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29  needPagerReset )
1b7b0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
1b7c0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1b7d0 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72         needPager
1b7e0 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  Reset = 0;.     
1b7f0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61   }.      rc = pa
1b800 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1b810 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50  _page(pPager,&pP
1b820 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b830 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69  ,0,1,0);.      i
1b840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b850 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1b860 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1b870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1b880 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1b890 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1b8a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1b8b0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1b8c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b8d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1b8e0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1b8f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1b900 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
1b910 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
1b920 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
1b930 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
1b940 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1b950 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
1b960 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1b970 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
1b980 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1b990 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
1b9a0 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
1b9b0 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
1b9c0 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
1b9d0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
1b9e0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
1b9f0 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
1ba00 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1ba10 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1ba20 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
1ba30 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
1ba40 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
1ba50 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
1ba60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1ba70 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1ba80 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1ba90 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
1baa0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1bab0 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
1bac0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
1bad0 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
1bae0 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1baf0 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
1bb00 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
1bb10 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
1bb20 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
1bb30 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
1bb40 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
1bb50 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
1bb60 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
1bb70 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
1bb80 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
1bb90 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
1bba0 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
1bbb0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1bbc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1bbd0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1bbe0 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1bbf0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1bc00 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
1bc10 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
1bc20 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
1bc30 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
1bc40 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
1bc50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1bc60 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
1bc70 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
1bc80 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
1bc90 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1bca0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
1bcb0 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
1bcc0 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
1bcd0 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
1bce0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
1bcf0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
1bd00 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
1bd10 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1bd20 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
1bd30 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
1bd40 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50    assert(.    pP
1bd50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1bd60 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c  ds==0 ||.    sql
1bd70 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1bd80 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  l(pPager->fd,SQL
1bd90 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1bda0 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54  HANGED,0)>=SQLIT
1bdb0 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  E_OK.  );..  /* 
1bdc0 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1bdd0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1bde0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1bdf0 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1be00 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1be10 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1be20 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1be30 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1be40 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1be50 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1be60 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1be70 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1be80 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1be90 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1bea0 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1beb0 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1bec0 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1bed0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1bee0 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1bef0 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1bf00 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1bf10 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1bf20 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1bf30 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1bf40 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1bf50 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1bf60 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1bf70 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1bf80 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1bf90 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1bfa0 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1bfb0 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1bfc0 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1bfd0 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1bfe0 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1bff0 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1c000 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1c010 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1c020 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1c030 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1c040 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c050 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1c060 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1c070 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1c080 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1c090 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1c0a0 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1c0b0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1c0c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1c0d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1c0e0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1c0f0 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1c100 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1c110 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1c120 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1c130 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1c140 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1c150 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1c160 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
1c170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c180 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1c190 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1c1a0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1c1b0 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20  [0]!='\0');.    
1c1c0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1c1d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1c1e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c1f0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1c200 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
1c210 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1c220 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1c230 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
1c240 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
1c250 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
1c260 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
1c270 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
1c280 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
1c290 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1c2a0 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
1c2b0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1c2c0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1c2d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c2e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1c2f0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1c300 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1c310 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1c320 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1c330 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1c340 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1c350 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1c360 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1c370 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1c380 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1c390 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1c3a0 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1c3b0 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1c3c0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1c3d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c3e0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1c3f0 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1c400 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1c410 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1c420 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44  into .** pPg->pD
1c430 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f  ata. A shared lo
1c440 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
1c450 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  st be held on th
1c460 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1c470 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
1c480 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1c490 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  d..**.** If page
1c4a0 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e   1 is read, then
1c4b0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
1c4c0 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
1c4d0 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68   is set to.** th
1c4e0 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
1c4f0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1c500 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ile..**.** If an
1c510 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1c520 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1c530 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
1c540 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1c550 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  * Otherwise, SQL
1c560 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c570 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1c580 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48  t readDbPage(PgH
1c590 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
1c5a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c5b0 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65  >pPager; /* Page
1c5c0 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  r object associa
1c5d0 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50  ted with page pP
1c5e0 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
1c5f0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20   = pPg->pgno;   
1c600 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1c610 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  er to read */.  
1c620 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c630 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
1c640 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1c650 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20 30   int isInWal = 0
1c660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c670 20 54 72 75 65 20 69 66 20 70 61 67 65 20 69 73   True if page is
1c680 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a   in log file */.
1c690 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1c6a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1c6b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1c6c0 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1c6d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c6e0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1c6f0 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1c700 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1c710 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1c720 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21  ;..  if( NEVER(!
1c730 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1c740 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  d)) ){.    asser
1c750 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
1c760 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ile );.    memse
1c770 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
1c780 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c790 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
1c7a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1c7b0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
1c7c0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1c7d0 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1c7e0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1c7f0 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1c800 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1c810 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61  lite3WalRead(pPa
1c820 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
1c830 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c   &isInWal, pgsz,
1c840 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1c850 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1c860 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61  TE_OK && !isInWa
1c870 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  l ){.    i64 iOf
1c880 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
1c890 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1c8a0 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
1c8b0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1c8c0 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
1c8d0 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66  Data, pgsz, iOff
1c8e0 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
1c8f0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1c900 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1c910 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c920 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1c930 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1c940 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1c950 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
1c960 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
1c970 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
1c980 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
1c990 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
1c9a0 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
1c9b0 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
1c9c0 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
1c9d0 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
1c9e0 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
1c9f0 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1ca00 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
1ca10 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
1ca20 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1ca30 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
1ca40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ca50 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
1ca60 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
1ca70 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
1ca80 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
1ca90 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
1caa0 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
1cab0 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
1cac0 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
1cad0 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
1cae0 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
1caf0 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
1cb00 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1cb10 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
1cb20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
1cb30 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
1cb40 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
1cb50 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
1cb60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1cb70 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
1cb80 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
1cb90 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
1cba0 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20  * white noising 
1cbb0 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1cbc0 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1cbd0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1cbe0 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1cbf0 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1cc00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1cc10 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1cc20 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1cc30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1cc40 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1cc50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cc60 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1cc70 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1cc80 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1cc90 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1cca0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1ccb0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1ccc0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1ccd0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1cce0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1ccf0 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  Pg->pData, pgno,
1cd00 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   3, rc = SQLITE_
1cd10 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52  NOMEM);..  PAGER
1cd20 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1cd30 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1cd40 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1cd50 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1cd60 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1cd70 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1cd80 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1cd90 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1cda0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1cdb0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1cdc0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1cdd0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1cde0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1cdf0 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1ce00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1ce10 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1ce20 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1ce30 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1ce40 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1ce50 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1ce60 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1ce70 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1ce80 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1ce90 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1cea0 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1ceb0 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1cec0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1ced0 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1cee0 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1cef0 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1cf00 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1cf10 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1cf20 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1cf30 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1cf40 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1cf50 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1cf60 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1cf70 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1cf80 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1cf90 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1cfa0 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1cfb0 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1cfc0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1cfd0 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1cfe0 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1cff0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1d000 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1d010 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1d020 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1d030 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1d040 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1d050 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1d060 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1d070 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1d080 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1d090 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1d0a0 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1d0b0 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1d0c0 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1d0d0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1d0e0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1d0f0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1d100 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1d110 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1d120 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1d130 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1d140 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1d150 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1d160 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1d170 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1d180 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1d190 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1d1a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d1b0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1d1c0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1d1d0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1d1e0 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1d1f0 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1d200 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1d210 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1d220 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1d230 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1d240 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1d250 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1d260 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1d270 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1d280 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1d290 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1d2a0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1d2b0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1d2c0 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1d2d0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1d2e0 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1d2f0 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1d300 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1d310 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1d320 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1d330 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1d340 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1d350 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1d360 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1d370 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1d380 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1d390 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1d3a0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1d3b0 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1d3c0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1d3d0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1d3e0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1d3f0 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1d400 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1d410 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1d420 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1d430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d440 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1d450 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1d460 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1d470 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
1d480 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
1d490 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
1d4a0 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
1d4b0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1d4c0 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
1d4d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d4e0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
1d4f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d500 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
1d510 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
1d520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d530 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1d540 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
1d550 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1d560 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1d570 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ref(pPg);.    }.
1d580 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1d590 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1d5a0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1d5b0 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1d5c0 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1d5d0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1d5e0 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1d5f0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1d600 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1d610 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1d620 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1d630 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1d640 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1d650 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1d660 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1d670 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1d680 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1d690 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1d6a0 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1d6b0 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1d6c0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1d6d0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1d6e0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1d6f0 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1d700 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1d710 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1d720 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1d730 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1d740 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1d750 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1d760 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1d770 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1d780 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1d790 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d7a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d7b0 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1d7c0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1d7d0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1d7e0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1d7f0 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1d800 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1d810 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d830 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d840 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1d850 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1d860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1d870 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1d880 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1d890 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1d8a0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1d8b0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1d8c0 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1d8d0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1d8e0 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1d8f0 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1d900 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1d910 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1d920 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1d930 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1d940 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1d950 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1d960 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1d970 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1d980 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1d990 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1d9a0 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1d9b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1d9c0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1d9d0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1d9e0 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1d9f0 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1da00 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1da10 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1da20 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1da30 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1da40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1da50 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1da60 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1da70 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1da80 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1da90 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1daa0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1dab0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1dac0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1dad0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1dae0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1daf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1db00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1db10 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1db20 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1db30 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1db40 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1db50 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1db60 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1db70 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1db80 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1db90 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1dba0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1dbb0 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1dbc0 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1dbd0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1dbe0 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1dbf0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1dc00 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1dc10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1dc20 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1dc30 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1dc40 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1dc50 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1dc60 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1dc70 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1dc80 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1dc90 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1dca0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1dcb0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1dcc0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1dcd0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1dce0 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd00 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1dd10 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1dd20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1dd30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1dd40 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1dd50 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1dd60 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c  .  int isCommit,
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1dd90 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1dda0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 46 6c 61 67  /.  int syncFlag
1ddb0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1ddc0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
1ddd0 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29  pass to OsSync()
1dde0 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20   (or 0) */.){.  
1ddf0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de10 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1de20 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1de30 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1de40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48  efined(SQLITE_CH
1de50 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48  ECK_PAGES).  PgH
1de60 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de80 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1de90 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66   pages */.#endif
1dea0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1deb0 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 23 69 66 64  er->pWal );.#ifd
1dec0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ded0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1dee0 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69   the page list i
1def0 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
1df00 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d  rder */.  for(p=
1df10 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70  pList; p && p->p
1df20 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72  Dirty; p=p->pDir
1df30 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
1df40 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44   p->pgno < p->pD
1df50 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  irty->pgno );.  
1df60 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
1df70 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
1df80 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e  /* If a WAL tran
1df90 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
1dfa0 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72   committed, ther
1dfb0 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
1dfc0 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20   writing.    ** 
1dfd0 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70  any pages with p
1dfe0 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
1dff0 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61  ter than nTrunca
1e000 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20  te into the WAL 
1e010 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  file..    ** The
1e020 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
1e030 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65  read by any clie
1e040 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68  nt. So remove th
1e050 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72  em from the pDir
1e060 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68  ty.    ** list h
1e070 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64  ere. */.    PgHd
1e080 72 20 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20  r *p;.    PgHdr 
1e090 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73  **ppNext = &pLis
1e0a0 74 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  t;.    for(p=pLi
1e0b0 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70  st; (*ppNext = p
1e0c0 29 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  ); p=p->pDirty){
1e0d0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67  .      if( p->pg
1e0e0 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 20  no<=nTruncate ) 
1e0f0 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69  ppNext = &p->pDi
1e100 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  rty;.    }.    a
1e110 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1e120 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74    }..  if( pList
1e130 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
1e140 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1e150 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
1e160 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1e170 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1e180 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1e190 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1e1a0 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1e1b0 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 46 6c 61  sCommit, syncFla
1e1c0 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1e1d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1e1e0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1e1f0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1e200 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1e210 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1e220 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1e230 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1e240 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1e250 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1e260 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1e270 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e280 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c  CHECK_PAGES.  pL
1e290 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1e2a0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1e2b0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1e2c0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1e2d0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1e2e0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
1e2f0 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65  ehash(p);.  }.#e
1e300 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
1e310 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
1e320 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
1e330 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
1e340 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1e350 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
1e360 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
1e370 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
1e380 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
1e390 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
1e3a0 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
1e3b0 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
1e3c0 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
1e3d0 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
1e3e0 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
1e3f0 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
1e400 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
1e410 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
1e420 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
1e430 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
1e440 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
1e450 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1e460 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
1e470 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
1e480 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1e490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e4b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1e4c0 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e4e0 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
1e4f0 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
1e500 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1e510 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1e520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1e530 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1e540 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
1e550 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1e560 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20  READER );..  /* 
1e570 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1e580 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77  dTransaction() w
1e590 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f  as not called fo
1e5a0 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20  r the previous. 
1e5b0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1e5c0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1e5d0 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63  EXCLUSIVE.  So c
1e5e0 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20  all it now.  If 
1e5f0 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c  we.  ** are in l
1e600 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d  ocking_mode=NORM
1e610 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29  AL and EndRead()
1e620 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1e630 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65  called,.  ** the
1e640 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20   duplicate call 
1e650 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  is harmless..  *
1e660 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  /.  sqlite3WalEn
1e670 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1e680 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1e690 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1e6a0 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
1e6b0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1e6c0 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a  Wal, &changed);.
1e6d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e6e0 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29  _OK || changed )
1e6f0 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
1e700 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
1e710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1e720 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1e730 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e740 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
1e750 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66  the transition f
1e760 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a  rom PAGER_OPEN.*
1e770 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  * to PAGER_READE
1e780 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72  R state to deter
1e790 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mine the size of
1e7a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e7b0 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28  le.** in pages (
1e7c0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67  assuming the pag
1e7d0 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79  e size currently
1e7e0 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
1e7f0 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a  .pageSize)..**.*
1e800 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
1e810 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
1e820 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1e830 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1e840 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70  database.** in p
1e850 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69  ages is stored i
1e860 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72  n *pnPage. Other
1e870 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  wise, an error c
1e880 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20  ode (perhaps.** 
1e890 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1e8a0 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20  AT) is returned 
1e8b0 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1e8c0 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  eft unmodified..
1e8d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1e8e0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
1e8f0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1e900 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
1e910 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e930 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
1e940 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
1e950 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57    /* Query the W
1e960 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f  AL sub-system fo
1e970 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
1e980 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69  ize. The WalDbsi
1e990 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ze().  ** functi
1e9a0 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  on returns zero 
1e9b0 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
1e9c0 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67  t open (i.e. Pag
1e9d0 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a  er.pWal==0), or.
1e9e0 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61    ** if the data
1e9f0 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
1ea00 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20   available. The 
1ea10 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1ea20 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61   not.  ** availa
1ea30 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1ea40 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74   sub-system if t
1ea50 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65  he log file is e
1ea60 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e  mpty or.  ** con
1ea70 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63  tains no valid c
1ea80 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
1ea90 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  tions..  */.  as
1eaa0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1eab0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1eac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1ead0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
1eae0 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  RED_LOCK || pPag
1eaf0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
1eb00 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69  ;.  nPage = sqli
1eb10 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61  te3WalDbsize(pPa
1eb20 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f  ger->pWal);..  /
1eb30 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1eb40 65 20 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61  e size was not a
1eb50 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
1eb60 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1eb70 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ,.  ** determine
1eb80 20 69 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65   it based on the
1eb90 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1eba0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
1ebb0 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20  he size.  ** of 
1ebc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ebd0 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  e is not an inte
1ebe0 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
1ebf0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20  the page-size,. 
1ec00 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74   ** round down t
1ec10 6f 20 74 68 65 20 6e 65 61 72 65 73 74 20 70 61  o the nearest pa
1ec20 67 65 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20  ge. Except, any 
1ec30 66 69 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  file larger than
1ec40 20 30 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e   0.  ** bytes in
1ec50 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65   size is conside
1ec60 72 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  red to contain a
1ec70 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
1ec80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1ec90 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34  ge==0 ){.    i64
1eca0 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
1ecb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ecc0 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e  ze of db file in
1ecd0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73   bytes */.    as
1ece0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1ecf0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1ed00 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1ed10 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
1ed20 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1ed30 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
1ed40 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1ed50 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a  Pager->fd, &n);.
1ed60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ed70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ed80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ed90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1eda0 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e  nPage = (Pgno)(n
1edb0 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
1edc0 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 50  ize);.    if( nP
1edd0 61 67 65 3d 3d 30 20 26 26 20 6e 3e 30 20 29 7b  age==0 && n>0 ){
1ede0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31  .      nPage = 1
1edf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1ee00 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1ee10 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1ee20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
1ee30 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1ee40 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
1ee50 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
1ee60 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
1ee70 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
1ee80 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
1ee90 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
1eea0 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
1eeb0 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
1eec0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
1eed0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
1eee0 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
1eef0 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
1ef00 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1ef10 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
1ef20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1ef30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
1ef40 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
1ef50 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
1ef60 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1ef70 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
1ef80 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68  .** exists if th
1ef90 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1efa0 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66  t empy, or verif
1efb0 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c  y that the *-wal
1efc0 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
1efd0 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65  t exist (by dele
1efe0 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20  ting it) if the 
1eff0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1f000 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
1f010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1f020 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74   not empty and t
1f030 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  he *-wal file ex
1f040 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  ists, open the p
1f050 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d  ager.** in WAL m
1f060 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74  ode.  If the dat
1f070 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f  abase is empty o
1f080 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69  r if no *-wal fi
1f090 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a  le exists and.**
1f0a0 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
1f0b0 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50  urs, make sure P
1f0c0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
1f0d0 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a   is not set to.*
1f0e0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
1f0f0 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52  ODE_WAL..**.** R
1f100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1f110 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1f120 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1f130 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
1f140 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
1f150 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f160 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
1f170 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
1f180 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
1f190 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
1f1a0 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
1f1b0 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
1f1c0 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
1f1d0 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
1f1e0 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
1f1f0 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
1f200 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
1f210 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
1f220 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
1f230 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
1f240 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
1f250 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1f260 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1f270 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
1f280 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
1f290 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
1f2a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
1f2b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f2c0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1f2d0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1f2e0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1f2f0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ARED_LOCK || pPa
1f300 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
1f310 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
1f320 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
1f330 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20     int isWal;   
1f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f350 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20   /* True if WAL 
1f360 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
1f370 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
1f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f390 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1f3a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f3b0 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
1f3c0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1f3d0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
1f3e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1f3f0 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  c;.    if( nPage
1f400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1f410 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
1f420 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
1f430 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
1f440 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20  ;.      isWal = 
1f450 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1f460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f470 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
1f480 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73      pPager->pVfs
1f490 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1f4a0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1f4b0 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20  ISTS, &isWal.   
1f4c0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
1f4d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f4e0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1f4f0 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
1f500 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1f510 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
1f520 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1f530 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1f540 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f550 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c  rOpenWal(pPager,
1f560 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
1f570 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1f580 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1f590 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
1f5a0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1f5b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
1f5c0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
1f5d0 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  DE_DELETE;.     
1f5e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1f5f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1f600 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  if../*.** Playba
1f610 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
1f620 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
1f630 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
1f640 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
1f650 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
1f660 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1f670 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
1f680 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
1f690 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
1f6a0 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
1f6b0 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
1f6c0 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
1f6d0 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
1f6e0 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
1f6f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
1f700 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
1f710 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
1f720 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
1f730 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
1f740 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
1f750 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
1f760 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
1f770 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
1f780 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
1f790 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
1f7a0 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
1f7b0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
1f7c0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
1f7d0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1f7e0 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
1f7f0 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
1f800 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1f810 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
1f820 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
1f830 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
1f840 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
1f850 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1f860 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
1f870 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
1f880 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1f890 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
1f8a0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
1f8b0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1f8c0 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
1f8d0 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
1f8e0 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
1f8f0 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
1f900 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1f910 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
1f920 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
1f930 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
1f940 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
1f950 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1f960 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
1f970 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
1f980 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
1f990 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
1f9a0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
1f9b0 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
1f9c0 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
1f9d0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
1f9e0 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
1f9f0 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
1fa00 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
1fa10 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
1fa20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
1fa30 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
1fa40 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
1fa50 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
1fa60 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
1fa70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
1fa80 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
1fa90 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
1faa0 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
1fab0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1fac0 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
1fad0 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
1fae0 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
1faf0 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
1fb00 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
1fb10 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
1fb20 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
1fb30 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
1fb40 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
1fb50 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
1fb60 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
1fb70 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
1fb80 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
1fb90 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
1fba0 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
1fbb0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1fbc0 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
1fbd0 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
1fbe0 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
1fbf0 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
1fc00 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
1fc10 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
1fc20 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
1fc30 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
1fc40 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
1fc50 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
1fc60 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
1fc70 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
1fc80 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
1fc90 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
1fca0 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
1fcb0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
1fcc0 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
1fcd0 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
1fce0 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
1fcf0 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
1fd00 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
1fd10 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
1fd20 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd40 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
1fd50 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
1fd60 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
1fd70 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
1fd80 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
1fd90 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
1fda0 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
1fdb0 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
1fdc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1fdd0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1fde0 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
1fdf0 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
1fe00 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
1fe10 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
1fe20 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
1fe30 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1fe40 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
1fe50 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
1fe60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1fe70 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
1fe80 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20  TER_LOCKED );.. 
1fe90 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
1fea0 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
1feb0 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
1fec0 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
1fed0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
1fee0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
1fef0 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
1ff00 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
1ff10 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
1ff20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
1ff30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ff40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1ff50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
1ff60 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ff70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
1ff80 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
1ff90 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
1ffa0 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
1ffb0 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
1ffc0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
1ffd0 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
1ffe0 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
1fff0 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
20000 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70  >dbOrigSize;.  p
20010 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
20020 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
20030 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
20040 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26  ( !pSavepoint &&
20050 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
20060 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
20070 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  rn pagerRollback
20080 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Wal(pPager);.  }
20090 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
200a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
200b0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
200c0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
200d0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
200e0 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
200f0 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
20100 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
20110 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
20120 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
20130 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
20140 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
20150 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
20160 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
20170 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
20180 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
20190 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
201a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
201b0 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ff;.  assert( pa
201c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
201d0 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  )==0 || szJ==0 )
201e0 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
201f0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
20200 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
20210 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
20220 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
20230 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
20240 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
20250 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
20260 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
20270 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
20280 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
20290 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
202a0 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
202b0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
202c0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
202d0 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
202e0 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
202f0 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
20300 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
20310 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
20320 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
20330 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
20340 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
20350 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
20360 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
20370 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
20380 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
20390 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
203a0 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
203b0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
203c0 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
203d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
203e0 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
203f0 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
20400 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
20410 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
20420 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
20430 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
20440 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20450 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
20460 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
20470 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
20480 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
20490 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
204a0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
204b0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
204c0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
204d0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
204e0 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
204f0 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
20500 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20510 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
20520 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
20530 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
20540 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
20550 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
20560 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
20570 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
20580 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
20590 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
205a0 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
205b0 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
205c0 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
205d0 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
205e0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
205f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
20600 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20610 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
20620 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
20630 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20640 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
20650 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
20660 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
20670 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
20680 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
20690 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
206a0 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20  pPager, 0, szJ, 
206b0 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
206c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
206d0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
206e0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
206f0 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72  he "pPager->jour
20700 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
20710 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
20720 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20730 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69  f".    ** test i
20740 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63  s related to tic
20750 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20  ket #2565.  See 
20760 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69  the discussion i
20770 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
20780 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75  er_playback() fu
20790 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  nction for addit
207a0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
207b0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
207c0 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20  ( nJRec==0 .    
207d0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
207e0 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
207f0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
20800 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20810 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  f.    ){.      n
20820 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a  JRec = (u32)((sz
20830 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
20840 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f  nalOff)/JOURNAL_
20850 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
20860 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
20870 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
20880 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26  K && ii<nJRec &&
20890 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
208a0 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a  Off<szJ; ii++){.
208b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
208c0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
208d0 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
208e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
208f0 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
20900 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
20910 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
20920 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
20930 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
20940 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
20950 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff>=szJ );..  
20960 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
20970 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
20980 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
20990 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
209a0 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
209b0 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
209c0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
209d0 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
209e0 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
209f0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
20a00 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
20a10 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
20a20 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
20a30 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
20a40 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
20a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
20a60 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
20a70 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
20a80 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
20a90 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
20aa0 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  geSize);..    if
20ab0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
20ac0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
20ad0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61  c = sqlite3WalSa
20ae0 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67  vepointUndo(pPag
20af0 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70  er->pWal, pSavep
20b00 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b  oint->aWalData);
20b10 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
20b20 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
20b30 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
20b40 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
20b50 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
20b60 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20b70 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70   offset==ii*(4+p
20b80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
20b90 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
20ba0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
20bb0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
20bc0 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
20bd0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
20be0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20bf0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
20c00 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
20c10 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
20c20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20c30 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
20c40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
20c50 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
20c60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
20c70 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
20c80 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
20c90 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
20ca0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
20cb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
20cc0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
20cd0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
20ce0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
20cf0 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
20d00 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
20d10 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
20d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
20d30 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
20d40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
20d50 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
20d60 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
20d70 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
20d80 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
20d90 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
20da0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
20db0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
20dc0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
20dd0 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
20de0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
20df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
20e00 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
20e10 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
20e20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
20e30 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
20e40 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
20e50 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
20e60 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
20e70 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
20e80 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
20e90 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
20ea0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
20eb0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
20ec0 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
20ed0 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
20ee0 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
20f00 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
20f10 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
20f20 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
20f30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20f40 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
20f50 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
20f60 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
20f70 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
20f80 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
20f90 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
20fa0 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
20fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
20fd0 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
20fe0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
20ff0 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
21000 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
21010 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
21020 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
21030 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21040 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
21050 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
21060 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
21070 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
21080 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
21090 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
210a0 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
210b0 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
210c0 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
210d0 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
210e0 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
210f0 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
21100 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
21110 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
21120 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
21130 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
21140 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21150 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
21160 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
21170 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
21180 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
21190 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
211a0 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
211b0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
211c0 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
211d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
211e0 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
211f0 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
21200 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
21210 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
21220 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
21230 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
21240 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
21250 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
21260 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
21270 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
21280 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
21290 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
212a0 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
212b0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
212c0 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
212d0 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
212e0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
212f0 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
21300 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
21310 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
21320 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
21330 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
21340 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
21350 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
21360 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
21370 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
21380 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
21390 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
213a0 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
213b0 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
213c0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
213d0 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
213e0 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
213f0 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
21400 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
21410 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
21420 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
21430 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
21440 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
21450 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
21460 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
21470 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
21480 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
21490 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
214a0 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
214b0 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
214c0 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
214d0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
214e0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
214f0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
21500 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
21510 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
21520 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
21530 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
21540 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
21550 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
21560 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
21570 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
21580 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
21590 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
215a0 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
215b0 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
215c0 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
215d0 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
215e0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
215f0 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
21600 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
21610 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
21620 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
21630 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
21640 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
21650 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
21660 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65  etyLevel(.  Page
21670 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
21680 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
21690 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
216a0 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  el for */.  int 
216b0 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  level,          
216c0 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63    /* PRAGMA sync
216d0 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c  hronous.  1=OFF,
216e0 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c   2=NORMAL, 3=FUL
216f0 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75  L */  .  int bFu
21700 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f  llFsync,       /
21710 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79  * PRAGMA fullfsy
21720 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70  nc */.  int bCkp
21730 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a  tFullFsync    /*
21740 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
21750 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a  nt_fullfsync */.
21760 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  ){.  assert( lev
21770 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
21780 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  3 );.  pPager->n
21790 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
217a0 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
217b0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
217c0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
217d0 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
217e0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
217f0 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70  e) ?1:0;.  if( p
21800 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
21810 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
21820 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
21830 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
21840 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
21850 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e  se if( bFullFsyn
21860 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
21870 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
21880 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
21890 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
218a0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
218b0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
218c0 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46 75  else if( bCkptFu
218d0 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70  llFsync ){.    p
218e0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
218f0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
21900 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
21910 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21920 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
21930 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
21940 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
21950 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21960 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
21970 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
21980 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21990 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 7d 0a  C_NORMAL;.  }.}.
219a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
219b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
219c0 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
219d0 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
219e0 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
219f0 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
21a00 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
21a10 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
21a20 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
21a30 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
21a40 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
21a50 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
21a60 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
21a70 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
21a80 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
21a90 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
21aa0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
21ab0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
21ac0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
21ad0 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75  nto *pFile. Retu
21ae0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
21af0 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73  success .** or s
21b00 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
21b10 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
21b20 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
21b30 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64  omatically .** d
21b40 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
21b50 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
21b60 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
21b70 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73  * The flags pass
21b80 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61  ed to the VFS la
21b90 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c  yer xOpen() call
21ba0 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69   are those speci
21bb0 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d  fied.** by param
21bc0 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52  eter vfsFlags OR
21bd0 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ed with the foll
21be0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
21bf0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21c00 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51  DWRITE.**     SQ
21c10 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
21c20 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
21c30 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  PEN_EXCLUSIVE.**
21c40 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
21c50 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a  _DELETEONCLOSE.*
21c60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
21c70 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
21c80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
21c90 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
21ca0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
21cb0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
21cc0 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
21cd0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
21ce0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
21cf0 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
21d00 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
21d10 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
21d20 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
21d30 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
21d40 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
21d50 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
21d60 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
21d70 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
21d80 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
21d90 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
21da0 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
21db0 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
21dc0 7c 3d 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f  |=  .#if SQLITE_
21dd0 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
21de0 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  ECTION.         
21df0 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46     (pPager->vfsF
21e00 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
21e10 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f  _FILEPROTECTION_
21e20 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20  MASK)|.#endif.  
21e30 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21e40 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
21e50 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
21e60 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
21e70 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
21e80 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
21e90 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
21ea0 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c  LOSE;.  rc = sql
21eb0 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65  ite3OsOpen(pPage
21ec0 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c  r->pVfs, 0, pFil
21ed0 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b  e, vfsFlags, 0);
21ee0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
21ef0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
21f00 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72  en(pFile) );.  r
21f10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21f20 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
21f30 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
21f40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
21f50 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75  r invokes the bu
21f60 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71  sy-handler if sq
21f70 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65  lite3OsLock() re
21f80 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
21f90 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e  _BUSY when tryin
21fa0 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
21fb0 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53  m no-lock to a S
21fc0 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f  HARED lock,.** o
21fd0 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  r when trying to
21fe0 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
21ff0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
22000 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a   an EXCLUSIVE .*
22010 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20  * lock. It does 
22020 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65  *not* invoke the
22030 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68   busy handler wh
22040 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
22050 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52  m.** SHARED to R
22060 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e  ESERVED, or when
22070 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20   upgrading from 
22080 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53  SHARED to EXCLUS
22090 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63  IVE.** (which oc
220a0 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d  curs during hot-
220b0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
220c0 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a  ). Summary:.**.*
220d0 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20  *   Transition  
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220f0 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20        | Invokes 
22100 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20  xBusyHandler.** 
22110 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
22120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
22150 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e  NO_LOCK       ->
22160 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20   SHARED_LOCK    
22170 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41    | Yes.**   SHA
22180 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45  RED_LOCK   -> RE
22190 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c  SERVED_LOCK    |
221a0 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f   No.**   SHARED_
221b0 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53  LOCK   -> EXCLUS
221c0 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a  IVE_LOCK   | No.
221d0 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f  **   RESERVED_LO
221e0 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f  CK -> EXCLUSIVE_
221f0 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a  LOCK   | Yes.**.
22200 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68  ** If the busy-h
22210 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
22220 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
22230 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  , the lock is .*
22240 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74  * retried. If it
22250 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74   returns zero, t
22260 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42  hen the SQLITE_B
22270 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  USY error is.** 
22280 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
22290 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61  caller of the pa
222a0 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
222b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
222c0 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
222d0 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70  dler(.  Pager *p
222e0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22300 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
22310 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
22320 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20  dler)(void *),  
22330 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
22340 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65  r to busy-handle
22350 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
22360 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
22370 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20  erArg           
22380 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
22390 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73   to pass to xBus
223a0 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20  yHandler */.){  
223b0 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
223c0 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
223d0 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
223e0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
223f0 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
22400 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  Arg;.}../*.** Ch
22410 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
22420 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
22430 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
22440 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
22450 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
22460 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
22470 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
22480 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
22490 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
224a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
224b0 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
224c0 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
224d0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
224e0 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
224f0 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
22500 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
22510 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  ERR, an SQLITE_I
22520 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64  OERR_xxx sub-cod
22530 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e or SQLITE_FULL
22540 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
22550 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
22560 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
22570 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
22580 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
22590 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
225a0 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
225b0 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
225c0 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
225d0 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
225e0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
225f0 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
22600 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
22610 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
22620 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
22630 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
22640 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
22650 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
22660 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
22670 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
22680 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
22690 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
226a0 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
226b0 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
226c0 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
226d0 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
226e0 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
226f0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
22700 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
22710 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
22720 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
22730 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
22740 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
22750 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
22760 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
22770 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
22780 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
22790 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
227a0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
227b0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
227c0 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
227d0 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
227e0 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
227f0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
22800 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
22810 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
22820 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
22830 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
22840 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
22850 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
22860 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
22870 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
22880 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
22890 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
228a0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
228b0 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
228c0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
228d0 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
228e0 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
228f0 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
22900 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
22910 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
22920 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
22930 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
22940 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
22950 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
22960 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c   u32 *pPageSize,
22970 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
22980 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22990 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  E_OK;..  /* It i
229a0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
229b0 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65  o do a full asse
229c0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
229d0 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20   here, as this. 
229e0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79   ** function may
229f0 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
22a00 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e  within PagerOpen
22a10 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73  (), before the s
22a20 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
22a30 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   Pager object is
22a40 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
22a50 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  istent..  **.  *
22a60 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
22a70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
22a80 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
22a90 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
22aa0 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45  in .  ** PAGER_E
22ab0 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20  RROR state. But 
22ac0 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f  since PAGER_ERRO
22ad0 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65  R state guarante
22ae0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  es that.  ** the
22af0 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  re is at least o
22b00 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ne outstanding p
22b10 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74  age reference, t
22b20 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
22b30 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  * is a no-op for
22b40 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f   that case anyho
22b50 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70  w..  */..  u32 p
22b60 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
22b70 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
22b80 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
22b90 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
22ba0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
22bb0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
22bc0 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
22bd0 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
22be0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
22bf0 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50  ).   && sqlite3P
22c00 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
22c10 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
22c20 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a  0 .   && pageSiz
22c30 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28  e && pageSize!=(
22c40 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
22c50 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63  Size .  ){.    c
22c60 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c  har *pNew = NULL
22c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22c80 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20   New temp space 
22c90 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65  */.    i64 nByte
22ca0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
22cb0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
22cc0 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70  GER_OPEN && isOp
22cd0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
22ce0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22cf0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
22d00 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74  Pager->fd, &nByt
22d10 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
22d20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22d30 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
22d40 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
22d50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
22d60 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
22d70 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49  pNew ) rc = SQLI
22d80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
22d90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22da0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22db0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
22dc0 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
22dd0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e  r->dbSize = (Pgn
22de0 6f 29 28 6e 42 79 74 65 2f 70 61 67 65 53 69 7a  o)(nByte/pageSiz
22df0 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
22e00 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
22e10 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c  eSize;.      sql
22e20 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
22e30 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
22e40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
22e50 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
22e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
22e70 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
22e80 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
22e90 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
22ea0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53  }.  }..  *pPageS
22eb0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
22ec0 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63  geSize;.  if( rc
22ed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22ee0 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
22ef0 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
22f00 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
22f10 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
22f20 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
22f30 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
22f40 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
22f50 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
22f60 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
22f70 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
22f80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
22f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22fa0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
22fb0 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
22fc0 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
22fd0 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
22fe0 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
22ff0 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
23000 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
23010 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
23020 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
23030 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
23040 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
23050 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
23060 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
23070 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
23080 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
23090 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
230a0 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
230b0 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
230c0 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
230d0 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
230e0 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
230f0 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
23100 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
23110 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
23120 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
23130 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
23140 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
23150 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
23160 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
23170 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
23180 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
23190 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
231a0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
231b0 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
231c0 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
231d0 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
231e0 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
231f0 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
23200 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
23210 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23220 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
23230 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
23240 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
23250 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
23260 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
23270 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
23280 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
23290 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
232a0 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
232b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
232c0 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
232d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
232e0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
232f0 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20  GER_OPEN );     
23300 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20   /* Called only 
23310 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a  by OP_MaxPgcnt *
23320 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
23330 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
23340 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f  er->dbSize );  /
23350 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e  * OP_MaxPgcnt en
23360 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20  forces this */. 
23370 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
23380 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
23390 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
233a0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
233b0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
233c0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
233d0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
233e0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
233f0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
23400 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
23410 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
23420 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
23430 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
23440 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
23450 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
23460 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
23470 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
23480 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
23490 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
234a0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
234b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
234c0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
234d0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
234e0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
234f0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
23500 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
23510 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
23520 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
23530 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
23540 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
23550 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
23560 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
23570 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
23580 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
23590 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
235a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
235b0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
235c0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
235d0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
235e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
235f0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
23600 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
23610 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
23620 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
23630 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
23640 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
23650 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
23660 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
23670 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
23680 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
23690 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
236a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
236b0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
236c0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
236d0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
236e0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
236f0 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
23700 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
23710 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
23720 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
23730 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
23740 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
23750 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
23760 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
23770 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
23780 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
23790 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
237a0 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
237b0 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
237c0 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
237d0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
237e0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
237f0 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
23800 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
23810 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
23820 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
23830 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
23840 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
23850 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
23860 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
23870 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
23880 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
23890 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
238a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
238b0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
238c0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
238d0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
238e0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
238f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
23900 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
23910 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
23920 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
23930 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
23940 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
23950 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
23960 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
23970 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
23980 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
23990 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
239a0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
239b0 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
239c0 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
239d0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
239e0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
239f0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
23a00 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
23a10 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
23a20 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
23a30 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
23a40 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
23a50 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
23a60 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
23a70 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
23a80 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
23a90 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
23aa0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
23ab0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
23ac0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23ad0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
23ae0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23af0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23b00 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
23b10 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
23b20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
23b30 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
23b40 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
23b50 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
23b60 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
23b70 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
23b80 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
23b90 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
23ba0 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
23bb0 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
23bc0 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
23bd0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
23be0 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
23bf0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
23c00 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
23c10 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
23c20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
23c30 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
23c40 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
23c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
23c60 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
23c70 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
23c80 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
23c90 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
23ca0 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
23cb0 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
23cc0 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
23cd0 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
23ce0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
23cf0 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
23d00 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
23d10 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
23d20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
23d30 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
23d40 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
23d50 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
23d60 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
23d70 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
23d80 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
23d90 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
23da0 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
23db0 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
23dc0 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
23dd0 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
23de0 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
23df0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
23e00 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
23e10 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
23e20 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
23e30 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
23e40 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
23e50 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
23e60 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
23e70 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
23e80 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
23e90 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
23ea0 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
23eb0 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
23ec0 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
23ed0 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
23ee0 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
23ef0 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
23f00 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
23f10 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
23f20 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
23f30 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
23f40 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
23f70 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
23f80 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
23f90 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
23fa0 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
23fb0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
23fc0 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
23fd0 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
23fe0 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
23ff0 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
24000 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
24010 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
24020 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
24030 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
24040 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
24050 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
24060 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
24070 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
24080 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
24090 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
240a0 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
240b0 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
240c0 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
240d0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
240e0 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
240f0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
24100 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
24110 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
24120 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
24130 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
24140 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
24150 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
24160 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
24170 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
24180 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
24190 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
241a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
241b0 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
241c0 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
241d0 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
241e0 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
241f0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
24200 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
24210 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
24220 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
24230 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
24240 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
24250 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
24260 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
24270 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
24280 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
24290 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
242a0 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
242b0 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
242c0 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
242d0 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
242e0 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
242f0 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
24300 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
24310 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
24320 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
24330 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
24340 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
24350 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
24360 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
24370 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
24380 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
24390 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
243a0 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
243b0 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
243c0 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
243d0 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
243e0 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
243f0 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
24400 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
24410 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
24420 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
24430 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
24440 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
24450 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
24460 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
24470 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
24480 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
24490 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
244a0 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 75  correct behaviou
244b0 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
244c0 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
244d0 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
244e0 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
244f0 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
24500 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
24510 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
24520 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
24530 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
24540 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
24550 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
24560 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
24570 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
24580 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
24590 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
245a0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
245b0 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
245c0 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
245d0 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
245e0 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
245f0 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
24600 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
24610 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
24620 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
24630 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
24640 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
24650 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
24660 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
24670 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
24680 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
24690 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
246a0 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
246b0 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
246c0 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
246d0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
246e0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
246f0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
24700 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
24710 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
24720 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
24730 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
24740 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
24750 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
24760 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
24770 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
24780 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
24790 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
247a0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
247b0 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
247c0 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
247d0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
247e0 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
247f0 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
24800 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
24810 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
24820 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
24830 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
24840 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
24850 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
24860 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
24870 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
24880 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
24890 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  mitted..*/.void 
248a0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
248b0 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
248c0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
248d0 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
248e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
248f0 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
24900 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24910 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
24920 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
24930 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
24940 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72  Page;.  assertTr
24950 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
24960 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a  (pPager);.}.../*
24970 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24980 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
24990 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20  re attempting a 
249a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
249b0 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63  back. It.** sync
249c0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
249d0 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e  le to disk, then
249e0 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f   sets pPager->jo
249f0 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a  urnalHdr to the.
24a00 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  ** size of the j
24a10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74  ournal file so t
24a20 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c  hat the pager_pl
24a30 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
24a40 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74   knows.** that t
24a50 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
24a60 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
24a70 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79  synced..**.** Sy
24a80 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  ncing a hot-jour
24a90 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f  nal to disk befo
24aa0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
24ab0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e   roll it back en
24ac0 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69  sures .** that i
24ad0 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  f a power-failur
24ae0 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  e occurs during 
24af0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  the rollback, th
24b00 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a  e process that.*
24b10 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62  * attempts rollb
24b20 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79  ack following sy
24b30 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65  stem recovery se
24b40 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72  es the same jour
24b50 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  nal.** content a
24b60 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  s this process..
24b70 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
24b80 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e  ing goes as plan
24b90 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ned, SQLITE_OK i
24ba0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
24bb0 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51  rwise, .** an SQ
24bc0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
24bd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
24be0 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
24bf0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
24c00 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24c10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
24c20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
24c30 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
24c40 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
24c50 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
24c60 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20  C_NORMAL);.  }. 
24c70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24c80 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
24c90 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
24ca0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
24cb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
24cc0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
24cd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
24ce0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
24cf0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
24d00 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
24d10 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
24d20 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
24d30 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
24d40 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
24d50 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
24d60 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
24d70 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
24d80 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
24d90 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
24da0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
24db0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
24dc0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
24dd0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
24de0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
24df0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
24e00 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
24e10 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
24e20 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
24e30 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
24e40 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
24e50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
24e60 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
24e70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
24e80 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
24e90 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
24ea0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
24eb0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
24ec0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
24ed0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
24ee0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
24ef0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
24f00 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
24f10 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
24f20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
24f30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24f40 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
24f50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20   *pPager){.  u8 
24f60 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
24f70 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
24f80 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ..  assert( asse
24f90 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
24fa0 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61  Pager) );.  disa
24fb0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
24fc0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
24fd0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
24fe0 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20 70 50  alloc();.  /* pP
24ff0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
25000 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
25010 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
25020 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
25030 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
25040 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
25050 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65  ger->pWal, pPage
25060 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
25070 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
25080 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61  ze, pTmp);.  pPa
25090 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
250a0 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
250b0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
250c0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
250d0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
250e0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
250f0 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
25100 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
25110 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
25120 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
25130 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
25140 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
25150 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
25160 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
25170 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
25180 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
25190 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
251a0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
251b0 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
251c0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
251d0 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
251e0 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
251f0 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
25200 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
25210 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
25220 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
25230 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
25240 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
25250 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
25260 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
25270 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
25280 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
25290 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
252a0 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
252b0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
252c0 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
252d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
252e0 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
252f0 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
25300 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
25310 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
25320 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
25330 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
25340 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
25350 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
25360 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
25370 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
25380 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
25390 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
253a0 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
253b0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
253c0 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
253d0 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
253e0 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
253f0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
25400 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
25410 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
25420 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
25430 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
25440 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
25450 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
25460 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
25470 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
25480 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
25490 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
254a0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
254b0 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
254c0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
254d0 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
254e0 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
254f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
25500 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
25510 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
25520 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
25530 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
25540 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
25550 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
25560 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
25570 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
25580 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
25590 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
255a0 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
255b0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
255c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
255d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
255e0 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
255f0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
25600 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25610 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
25620 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
25630 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
25640 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
25650 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
25660 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
25670 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
25680 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
25690 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
256a0 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
256b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
256c0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
256d0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
256e0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
256f0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
25700 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
25710 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
25720 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
25730 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
25740 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
25750 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
25760 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
25770 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
25780 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
25790 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
257a0 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
257b0 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
257c0 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
257d0 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
257e0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
257f0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
25800 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
25810 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
25820 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
25830 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25840 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
25850 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
25860 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
25870 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
25880 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
25890 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
258a0 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
258b0 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  he the file-syst
258c0 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
258d0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
258e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
258f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
25900 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
25910 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
25920 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
25930 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
25940 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
25950 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
25960 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
25970 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
25980 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
25990 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
259a0 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
259b0 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
259c0 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
259d0 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
259e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
259f0 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
25a00 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
25a10 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
25a20 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
25a30 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
25a40 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
25a50 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
25a60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25a70 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
25a80 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
25a90 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
25aa0 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
25ab0 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
25ac0 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
25ad0 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
25ae0 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
25af0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
25b00 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
25b10 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
25b20 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
25b30 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
25b40 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
25b50 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
25b60 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
25b70 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
25b80 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
25b90 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
25ba0 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
25bb0 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
25bc0 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
25bd0 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
25be0 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
25bf0 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66  .**   }.**.** If
25c00 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
25c10 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
25c20 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
25c30 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
25c40 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
25c50 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
25c60 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
25c70 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
25c80 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
25c90 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
25ca0 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
25cb0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
25cc0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
25cd0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
25ce0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
25cf0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
25d00 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74  t newHdr){.  int
25d10 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d30 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
25d40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25d50 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
25d60 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
25d70 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
25d80 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
25d90 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
25da0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
25db0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
25dc0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
25dd0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
25de0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
25df0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25e00 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
25e10 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
25e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
25e30 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
25e40 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
25e50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
25e60 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
25e70 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
25e80 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
25e90 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
25ea0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
25eb0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
25ec0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  ){.      const i
25ed0 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
25ee0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
25ef0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
25f00 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
25f10 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
25f20 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
25f30 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
25f40 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
25f50 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
25f60 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
25f70 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62  deals with an ob
25f80 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49  scure problem. I
25f90 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65  f the last conne
25fa0 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ction.        **
25fb0 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74   that wrote to t
25fc0 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73  his database was
25fd0 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65   operating in pe
25fe0 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  rsistent-journal
25ff0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
26000 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
26010 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74  al file may at t
26020 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c  his point actual
26030 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20  ly be larger.   
26040 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67       ** than Pag
26050 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79  er.journalOff by
26060 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74  tes. If the next
26070 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f   thing in the jo
26080 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
26090 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f   file happens to
260a0 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   be a journal-he
260b0 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73  ader (written as
260c0 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20   part of the.   
260d0 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
260e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72   connection's tr
260f0 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
26100 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
26110 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
26120 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
26130 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
26140 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
26150 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
26160 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
26170 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
26180 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26190 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
261a0 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
261b0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
261c0 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
261d0 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
261e0 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
261f0 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
26200 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
26210 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
26220 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
26230 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
26240 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
26250 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
26260 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
26270 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
26280 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
26290 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
262a0 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
262b0 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
262c0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
262d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
262e0 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
262f0 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
26300 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
26310 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
26320 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
26330 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
26340 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
26350 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
26360 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
26370 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
26380 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
26390 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
263a0 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
263b0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
263c0 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
263d0 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
263e0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
263f0 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
26400 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
26410 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
26420 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
26430 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
26440 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
26450 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
26460 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
26470 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
26480 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
26490 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
264a0 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
264b0 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
264c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
264d0 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
264e0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20  set;.        u8 
264f0 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20  aMagic[8];.     
26500 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69     u8 zHeader[si
26510 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
26520 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20  ic)+4];..       
26530 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
26540 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
26550 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
26560 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
26570 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
26580 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
26590 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
265a0 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
265b0 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65     iNextHdrOffse
265c0 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  t = journalHdrOf
265d0 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
265e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
265f0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
26600 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
26610 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
26620 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
26630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
26640 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
26650 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
26660 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
26670 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
26680 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
26690 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
266a0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
266b0 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
266c0 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
266d0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
266e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
266f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
26700 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
26710 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
26720 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
26730 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
26740 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
26750 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
26760 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
26770 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
26780 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
26790 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
267a0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
267b0 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
267c0 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
267d0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
267e0 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
267f0 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
26800 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
26810 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
26820 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
26830 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
26840 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
26850 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
26860 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
26870 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
26880 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
26890 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
268a0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
268b0 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
268c0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
268d0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
268e0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
268f0 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
26900 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
26910 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
26920 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
26930 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
26940 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
26950 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
26960 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
26970 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
26980 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
26990 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
269a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
269b0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
269c0 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
269d0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
269e0 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
269f0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
26a00 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
26a10 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
26a20 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
26a30 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
26a40 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
26a50 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
26a60 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
26a70 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
26a80 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
26a90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26aa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
26ab0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
26ac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
26ad0 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
26ae0 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
26af0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
26b00 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  dr));.        rc
26b10 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
26b20 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e(.            p
26b30 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
26b40 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
26b50 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  der), pPager->jo
26b60 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20  urnalHdr.       
26b70 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
26b80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
26b90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
26ba0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d   }.      if( 0==
26bb0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
26bc0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
26bd0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
26be0 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
26bf0 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
26c00 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
26c10 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
26c20 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
26c30 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
26c40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
26c50 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
26c60 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
26c70 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
26c80 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
26c90 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
26ca0 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
26cb0 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
26cc0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
26cd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26ce0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26cf0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67     }..      pPag
26d00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
26d10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26d20 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Off;.      if( n
26d30 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63  ewHdr && 0==(iDc
26d40 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
26d50 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
26d60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
26d70 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ec = 0;.        
26d80 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
26d90 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
26da0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26db0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
26dc0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
26dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
26de0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
26df0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
26e00 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
26e10 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68  ..  /* Unless th
26e20 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
26e30 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  Sync mode, the j
26e40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
26e50 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65  just .  ** succe
26e60 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
26e70 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61  Either way, clea
26e80 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
26e90 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20  _SYNC flag on . 
26ea0 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20   ** all pages.. 
26eb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
26ec0 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67  cheClearSyncFlag
26ed0 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
26ee0 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53  e);.  pPager->eS
26ef0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
26f00 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73  TER_DBMOD;.  ass
26f10 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
26f20 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
26f30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
26f40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26f50 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
26f60 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
26f70 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
26f80 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
26f90 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
26fa0 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
26fb0 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
26fc0 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
26fd0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
26fe0 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
26ff0 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
27000 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
27010 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
27020 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
27030 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
27040 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
27050 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
27060 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
27070 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
27080 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
27090 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
270a0 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
270b0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
270c0 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
270d0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
270e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
270f0 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
27100 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
27110 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
27120 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
27130 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
27140 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
27150 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
27160 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
27170 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
27180 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
27190 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
271a0 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
271b0 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
271c0 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
271d0 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
271e0 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
271f0 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
27200 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
27210 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
27220 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
27230 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
27240 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
27250 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
27260 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
27270 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
27280 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
27290 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
272a0 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
272b0 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
272c0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
272d0 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
272e0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
272f0 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
27300 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
27310 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
27320 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
27330 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
27340 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
27350 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
27360 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
27370 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
27380 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
27390 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
273a0 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
273b0 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
273c0 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
273d0 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
273e0 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
273f0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
27400 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
27410 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
27420 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
27430 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
27440 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
27450 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
27460 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
27470 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
27480 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
27490 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
274a0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
274b0 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
274c0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
274d0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
274e0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
274f0 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
27500 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
27510 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
27520 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
27530 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
27540 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
27550 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  Hdr *pList){.  i
27560 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27570 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
27580 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
27590 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
275a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
275b0 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c  y called for rol
275c0 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20  lback pagers in 
275d0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
275e0 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
275f0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
27600 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
27610 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
27620 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
27630 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72  DBMOD );.  asser
27640 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
27650 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
27660 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
27670 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
27680 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
27690 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
276a0 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
276b0 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
276c0 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
276d0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
276e0 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
276f0 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
27700 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
27710 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
27720 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
27730 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
27740 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
27750 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
27760 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
27770 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
27780 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
27790 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
277a0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
277b0 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
277c0 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
277d0 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   Before the firs
277e0 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68  t write, give th
277f0 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20  e VFS a hint of 
27800 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  what the final. 
27810 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69   ** file size wi
27820 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  ll be..  */.  as
27830 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
27840 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
27850 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69  ager->fd) );.  i
27860 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27870 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
27880 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  ze>pPager->dbHin
27890 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c  tSize ){.    sql
278a0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
278b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
278c0 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
278d0 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
278e0 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
278f0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
27900 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
27910 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
27920 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20  T, &szFile);.   
27930 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
27940 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
27950 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  Size;.  }..  whi
27960 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
27970 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
27980 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c    Pgno pgno = pL
27990 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20  ist->pgno;..    
279a0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
279b0 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
279c0 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
279d0 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
279e0 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
279f0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
27a00 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
27a10 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
27a20 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c  eImage() was cal
27a30 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
27a40 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
27a50 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
27a60 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
27a70 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
27a80 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
27a90 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
27aa0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
27ab0 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74   ** Also, do not
27ac0 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70   write out any p
27ad0 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65  age that has the
27ae0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
27af0 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65  E flag.    ** se
27b00 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65  t (set by sqlite
27b10 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
27b20 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ))..    */.    i
27b30 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
27b40 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
27b50 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
27b60 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
27b70 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
27b80 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
27b90 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
27ba0 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  ze;   /* Offset 
27bb0 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20  to write */.    
27bc0 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20    char *pData;  
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bf0 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74   /* Data to writ
27c00 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20  e */    ..      
27c10 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e  assert( (pList->
27c20 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
27c30 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
27c40 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
27c50 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
27c60 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
27c70 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20  r(pList);..     
27c80 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64   /* Encode the d
27c90 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
27ca0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
27cb0 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67  pList->pData, pg
27cc0 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51  no, 6, return SQ
27cd0 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
27ce0 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
27cf0 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
27d00 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
27d10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
27d20 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
27d30 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
27d40 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
27d50 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
27d60 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
27d70 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
27d80 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
27d90 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
27da0 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
27db0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
27dc0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
27dd0 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
27de0 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
27df0 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
27e00 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
27e10 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
27e20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
27e30 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
27e40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
27e50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
27e60 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
27e70 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
27e80 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
27e90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
27ea0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
27eb0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
27ec0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
27ed0 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
27ee0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55     }..      /* U
27ef0 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70  pdate any backup
27f00 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67   objects copying
27f10 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
27f20 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a   this pager. */.
27f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
27f40 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
27f50 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
27f60 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61   (u8*)pList->pDa
27f70 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45  ta);..      PAGE
27f80 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25  RTRACE(("STORE %
27f90 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
27fa0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
27fc0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
27fd0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
27fe0 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20  h(pList)));.    
27ff0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
28000 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
28010 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
28020 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
28030 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
28040 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  db_count);.     
28050 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
28060 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
28070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
28080 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
28090 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
280a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
280b0 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
280c0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
280d0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
280e0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
280f0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
28100 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28110 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
28120 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
28130 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
28140 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
28150 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
28160 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
28170 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
28180 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
28190 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
281a0 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
281b0 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
281c0 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
281d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
281e0 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
281f0 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
28200 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
28210 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
28220 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
28230 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
28240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28250 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
28260 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
28270 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
28280 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
28290 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
282a0 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
282b0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
282c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
282d0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
282e0 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
282f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
28300 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
28310 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
28320 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
28330 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
28340 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
28350 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
28360 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
28370 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
28380 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
28390 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
283a0 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
283b0 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
283c0 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
283d0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
283e0 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
283f0 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
28400 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
28410 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
28420 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
28430 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
28440 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
28450 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
28460 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
28470 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
28480 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
28490 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
284a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
284b0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
284c0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
284d0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
284e0 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
284f0 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
28500 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
28510 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
28520 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
28530 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
28540 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
28550 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
28560 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
28570 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
28580 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
28590 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
285a0 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
285b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
285c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
285d0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
285e0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
285f0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
28600 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
28610 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
28620 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
28630 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
28640 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
28650 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
28660 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
28670 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
28680 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
28690 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
286a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
286b0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
286c0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
286d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
286e0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
286f0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
28700 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
28710 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
28720 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20  rnal(pPg) .     
28730 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
28740 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
28750 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
28760 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
28770 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
28780 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
28790 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
287a0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
287b0 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
287c0 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
287d0 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
287e0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
287f0 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
28800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28810 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
28820 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
28830 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
28840 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
28850 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
28860 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
28870 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
28880 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
28890 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
288a0 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
288b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
288c0 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
288d0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
288e0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
288f0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
28900 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
28910 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
28920 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
28930 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
28940 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
28950 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
28960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28970 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28980 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28990 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
289a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
289b0 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
289c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
289d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
289e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
289f0 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
28a00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
28a10 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
28a20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
28a30 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
28a40 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
28a50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28a60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
28a70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
28a80 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
28a90 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
28aa0 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
28ab0 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
28ac0 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
28ad0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
28ae0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
28af0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
28b00 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
28b10 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
28b20 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
28b30 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
28b40 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
28b50 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
28b60 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
28b70 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
28b80 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
28b90 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
28ba0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
28bb0 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
28bc0 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
28bd0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
28be0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
28bf0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
28c00 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
28c10 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
28c20 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
28c30 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
28c40 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
28c50 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
28c60 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
28c70 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
28c80 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
28c90 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
28ca0 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
28cb0 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
28cc0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
28cd0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
28ce0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
28cf0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
28d00 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
28d10 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
28d20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
28d30 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
28d40 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
28d50 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
28d60 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
28d70 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
28d80 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
28d90 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
28da0 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
28db0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
28dc0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
28dd0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
28de0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
28df0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
28e00 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
28e10 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
28e20 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
28e30 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
28e40 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
28e50 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
28e60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
28e70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
28e80 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
28e90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
28ea0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
28eb0 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
28ec0 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  e doNotSyncSpill
28ed0 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72   flag is set dur
28ee0 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
28ef0 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
28f00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
28f10 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
28f20 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
28f30 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
28f40 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
28f50 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
28f60 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
28f70 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
28f80 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
28f90 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
28fa0 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
28fb0 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
28fc0 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66  The doNotSpill f
28fd0 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  lag inhibits all
28fe0 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20   cache spilling 
28ff0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
29000 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f  ether.  ** or no
29010 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
29020 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
29030 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  et during a roll
29040 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
29050 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f  Spilling is also
29060 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e   prohibited when
29070 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
29080 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f  te since that co
29090 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f  uld.  ** lead to
290a0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
290b0 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63  tion.   In the c
290c0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
290d0 61 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73  aton it .  ** is
290e0 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
290f0 73 71 6c 69 74 65 33 50 43 61 63 68 65 46 65 74  sqlite3PCacheFet
29100 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65  ch() to be calle
29110 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  d with createFla
29120 67 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20  g==1.  ** while 
29130 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
29140 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20  te, hence it is 
29150 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  impossible for t
29160 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20  his routine to. 
29170 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e   ** be called in
29180 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
29190 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
291a0 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45   we include a NE
291b0 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20  VER().  ** test 
291c0 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  for the error st
291d0 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61  ate as a safegua
291e0 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72  rd against futur
291f0 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a  e changes..  */.
29200 20 20 70 50 61 67 65 72 2d 3e 68 61 73 53 65 65    pPager->hasSee
29210 6e 53 74 72 65 73 73 20 3d 20 31 3b 0a 20 20 69  nStress = 1;.  i
29220 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
29230 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
29240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29250 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
29260 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72 6e 20  tSpill ) return 
29270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
29280 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
29290 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50 67 2d  ncSpill && (pPg-
292a0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
292b0 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a  EED_SYNC)!=0 ){.
292c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
292d0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67  E_OK;.  }..  pPg
292e0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
292f0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
29300 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
29310 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65  * Write a single
29320 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20   frame for this 
29330 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e  page to the log.
29340 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
29350 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
29360 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d  ) ){ .      rc =
29370 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
29380 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20  pPg); .    }.   
29390 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
293a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
293b0 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
293c0 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20  pPager, pPg, 0, 
293d0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
293e0 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
293f0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
29400 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
29410 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
29420 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
29430 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c  EED_SYNC .     |
29440 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
29450 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
29460 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20  ACHEMOD.    ){. 
29470 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
29480 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29  urnal(pPager, 1)
29490 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
294a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
294b0 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67  mber of this pag
294c0 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
294d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
294e0 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
294f0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
29500 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  it may need to b
29510 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
29520 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   sub-journal..  
29530 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
29540 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
29550 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
29560 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69  elist() below wi
29570 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63  ll not.    ** ac
29580 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74  tually write dat
29590 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e  a to the file in
295a0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
295b0 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64  **.    ** Consid
295c0 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
295d0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65   sequence of eve
295e0 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nts:.    **.    
295f0 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  **   BEGIN;.    
29600 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
29610 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
29620 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20     <modify page 
29630 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41  X>.    **     SA
29640 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20  VEPOINT sp;.    
29650 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b  **       <shrink
29660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
29670 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a  o Y pages>.    *
29680 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72  *       pagerStr
29690 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20  ess(page X).    
296a0 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
296b0 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20  TO sp;.    **.  
296c0 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74    ** If (X>Y), t
296d0 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74  hen when pagerSt
296e0 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70  ress is called p
296f0 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62  age X will not b
29700 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  e written.    **
29710 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
29720 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77  base file, but w
29730 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66  ill be dropped f
29740 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54  rom the cache. T
29750 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c  hen,.    ** foll
29760 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42  owing the "ROLLB
29770 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65  ACK TO sp" state
29780 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61  ment, reading pa
29790 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20  ge X will read. 
297a0 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20     ** data from 
297b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
297c0 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  e. This will be 
297d0 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65  the copy of page
297e0 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20   X as it.    ** 
297f0 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61  was when the tra
29800 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
29810 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20  , not as it was 
29820 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20  when "SAVEPOINT 
29830 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65  sp".    ** was e
29840 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  xecuted..    **.
29850 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74      ** The solut
29860 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
29870 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
29880 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
29890 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62   the .    ** sub
298a0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f  -journal file no
298b0 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  w (if it is not 
298c0 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20  already there), 
298d0 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a  so that it will.
298e0 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72      ** be restor
298f0 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e  ed to its curren
29900 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65  t value when the
29910 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
29920 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65  " is .    ** exe
29930 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cuted..    */.  
29940 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20    if( NEVER(.   
29950 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
29960 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e  OK && pPg->pgno>
29970 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
29980 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
29990 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b  ge(pPg).    ) ){
299a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
299b0 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
299c0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
299d0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
299e0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
299f0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
29a00 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
29a10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29a20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
29a30 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  rt( (pPg->flags&
29a40 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
29a50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
29a60 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
29a70 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70  gelist(pPager, p
29a80 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
29a90 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
29aa0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
29ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
29ad0 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
29ae0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
29af0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
29b00 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
29b10 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
29b20 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
29b30 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
29b40 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
29b50 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  c); .}.../*.** A
29b60 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
29b70 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67  ialize a new Pag
29b80 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75  er object and pu
29b90 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  t a pointer to i
29ba0 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72  t.** in *ppPager
29bb0 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75  . The pager shou
29bc0 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ld eventually be
29bd0 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e   freed by passin
29be0 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  g it.** to sqlit
29bf0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a  e3PagerClose()..
29c00 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
29c10 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
29c20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
29c30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
29c40 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69   open..** If zFi
29c50 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
29c60 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
29c70 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
29c80 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
29c90 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
29ca0 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
29cb0 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  hed. Temporary f
29cc0 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65  iles are be dele
29cd0 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
29ce0 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61  ally when they a
29cf0 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46  re closed. If zF
29d00 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
29d10 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61  ory:" then .** a
29d20 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
29d30 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
29d40 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
29d50 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a  tten to disk. .*
29d60 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73  * This can be us
29d70 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
29d80 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
29d90 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
29da0 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65   nExtra paramete
29db0 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  r specifies the 
29dc0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
29dd0 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
29de0 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68  ed.** along with
29df0 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72   each page refer
29e00 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65  ence. This space
29e10 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   is available to
29e20 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61   the user.** via
29e30 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
29e40 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e  rGetExtra() API.
29e50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
29e60 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65   argument is use
29e70 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f  d to specify pro
29e80 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66  perties that aff
29e90 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  ect the.** opera
29ea0 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
29eb0 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  r. It should be 
29ec0 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77  passed some bitw
29ed0 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a  ise combination.
29ee0 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f  ** of the PAGER_
29ef0 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
29f00 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
29f10 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  CK flags..**.** 
29f20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
29f30 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
29f40 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
29f50 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
29f60 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
29f70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
29f80 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
29f90 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
29fa0 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
29fb0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
29fc0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
29fd0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
29fe0 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
29ff0 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2a000 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2a010 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2a020 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2a030 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2a040 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2a050 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2a060 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2a070 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2a080 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2a090 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2a0a0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2a0b0 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2a0c0 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2a0d0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2a0e0 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2a0f0 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2a100 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2a110 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2a120 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2a130 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2a140 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2a150 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2a160 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2a170 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2a180 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2a190 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2a1a0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2a1b0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2a1c0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2a1d0 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2a1e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a1f0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2a200 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2a210 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2a220 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2a230 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2a240 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2a250 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2a260 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2a270 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2a280 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2a290 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2a2a0 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2a2b0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2a2c0 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2a2d0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2a2e0 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2a2f0 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2a300 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2a310 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2a320 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2a330 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2a340 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2a350 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2a360 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2a370 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2a380 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2a390 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2a3a0 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2a3b0 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2a3c0 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2a3d0 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2a3e0 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2a3f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2a400 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2a410 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2a420 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   */.  int readOn
2a430 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2a440 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2a450 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2a460 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2a470 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2a480 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2a490 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2a4a0 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2a4b0 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2a4c0 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2a4d0 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2a4e0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2a4f0 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2a500 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a510 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2a520 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2a530 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2a540 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2a550 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2a560 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2a570 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52  nal */.  int noR
2a580 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
2a590 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
2a5a0 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72  LOCK)!=0;  /* Tr
2a5b0 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d  ue to omit read-
2a5c0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63  lock */.  int pc
2a5d0 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
2a5e0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20  e3PcacheSize(); 
2a5f0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
2a600 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50  o allocate for P
2a610 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73  Cache */.  u32 s
2a620 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2a630 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2a640 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c  SIZE;  /* Defaul
2a650 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  t page size */. 
2a660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
2a670 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49  i = 0;    /* URI
2a680 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f   args to copy */
2a690 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b  .  int nUri = 0;
2a6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a6b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2a6c0 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a  f URI args at *z
2a6d0 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  Uri */..  /* Fig
2a6e0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
2a6f0 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
2a700 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
2a710 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
2a720 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
2a730 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
2a740 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
2a750 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
2a760 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73  l). This.  ** is
2a770 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61   the maximum spa
2a780 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
2a790 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
2a7a0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2a7b0 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67   .  ** and a reg
2a7c0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
2a7d0 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74  e-handle. Note t
2a7e0 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a  hat a "regular j
2a7f0 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20  ournal-handle". 
2a800 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61   ** may be a wra
2a810 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20  pper capable of 
2a820 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73  caching the firs
2a830 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  t portion of the
2a840 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
2a850 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20  le in memory to 
2a860 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74  implement the at
2a870 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2a880 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20  ization (see .  
2a890 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a  ** source file j
2a8a0 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a  ournal.c)..  */.
2a8b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
2a8c0 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73  rnalSize(pVfs)>s
2a8d0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
2a8e0 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f  Size() ){.    jo
2a8f0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
2a900 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f  ROUND8(sqlite3Jo
2a910 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29  urnalSize(pVfs))
2a920 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a  ;.  }else{.    j
2a930 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2a940 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d   ROUND8(sqlite3M
2a950 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29  emJournalSize())
2a960 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
2a970 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
2a980 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
2a990 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
2a9a0 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
2a9b0 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66  er = 0;..#ifndef
2a9c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
2a9d0 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67  ORYDB.  if( flag
2a9e0 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59  s & PAGER_MEMORY
2a9f0 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20   ){.    memDb = 
2aa00 31 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  1;.    zFilename
2aa10 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
2aa20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
2aa30 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
2aa40 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
2aa50 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
2aa60 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
2aa70 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
2aa80 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
2aa90 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
2aaa0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2aab0 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
2aac0 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
2aad0 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
2aae0 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
2aaf0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2ab00 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2ab10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
2ab20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2ab30 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2ab40 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
2ab50 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
2ab60 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  c(nPathname*2);.
2ab70 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2ab80 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
2ab90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2aba0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61  M;.    }.    zPa
2abb0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
2abc0 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
2abd0 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
2abe0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
2abf0 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ails */.    rc =
2ac00 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
2ac10 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
2ac20 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
2ac30 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
2ac40 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2ac50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2ac60 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Pathname);.    z
2ac70 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65   = zUri = &zFile
2ac80 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  name[sqlite3Strl
2ac90 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
2aca0 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  1];.    while( *
2acb0 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  z ){.      z += 
2acc0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2acd0 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  z)+1;.      z +=
2ace0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2acf0 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  (z)+1;.    }.   
2ad00 20 6e 55 72 69 20 3d 20 26 7a 5b 31 5d 20 2d 20   nUri = &z[1] - 
2ad10 7a 55 72 69 3b 0a 20 20 20 20 69 66 28 20 72 63  zUri;.    if( rc
2ad20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
2ad30 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
2ad40 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
2ad50 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2ad60 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
2ad70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
2ad80 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
2ad90 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
2ada0 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
2adb0 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
2adc0 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
2add0 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
2ade0 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
2adf0 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
2ae00 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
2ae10 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
2ae20 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
2ae30 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2ae40 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
2ae50 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
2ae60 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
2ae70 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
2ae80 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
2ae90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2aea0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
2aeb0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
2aec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2aed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2aee0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
2aef0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
2af00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2af10 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
2af20 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
2af30 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
2af40 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
2af50 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
2af60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
2af70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2af80 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
2af90 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
2afa0 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
2afb0 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
2afc0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
2afd0 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
2afe0 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2aff0 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
2b000 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
2b010 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
2b020 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2b030 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2b040 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
2b050 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2b060 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
2b070 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
2b080 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
2b090 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
2b0a0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2b0b0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
2b0c0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2b0d0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2b0e0 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
2b0f0 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2b100 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2b110 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2b120 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
2b130 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2b140 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
2b150 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
2b160 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2b180 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
2b190 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
2b1a0 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
2b1b0 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
2b1c0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2b1d0 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
2b1e0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2b1f0 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2b200 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
2b210 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
2b220 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
2b230 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2b240 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
2b250 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
2b260 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
2b270 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
2b280 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2b290 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
2b2a0 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
2b2b0 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20  me + 1 + nUri + 
2b2c0 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2b2d0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
2b2e0 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20  hname + 8 + 1   
2b2f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
2b300 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
2b310 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2b320 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d  L.    + nPathnam
2b330 65 20 2b 20 34 20 2b 20 31 20 20 20 20 20 20 20  e + 4 + 1       
2b340 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a         /* zWal *
2b350 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  /.#endif.  );.  
2b360 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2b370 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c  TE_ALIGNMENT(SQL
2b380 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a  ITE_INT_TO_PTR(j
2b390 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29  ournalFileSize))
2b3a0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
2b3b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
2b3c0 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
2b3d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b3e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
2b3f0 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20  Pager =         
2b400 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50       (Pager*)(pP
2b410 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tr);.  pPager->p
2b420 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61  PCache =    (PCa
2b430 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  che*)(pPtr += RO
2b440 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
2b450 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72  ger)));.  pPager
2b460 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65  ->fd =   (sqlite
2b470 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2b480 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
2b490 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ze));.  pPager->
2b4a0 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  sjfd = (sqlite3_
2b4b0 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2b4c0 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2b4d0 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72  File));.  pPager
2b4e0 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65  ->jfd =  (sqlite
2b4f0 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2b500 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2b510 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
2b520 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61  lename =    (cha
2b530 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  r*)(pPtr += jour
2b540 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2b550 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2b560 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61  TE_ALIGNMENT(pPa
2b570 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
2b580 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50  /* Fill in the P
2b590 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61  ager.zFilename a
2b5a0 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
2b5b0 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65  l buffers, if re
2b5c0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
2b5d0 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20   zPathname ){.  
2b5e0 20 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e    assert( nPathn
2b5f0 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61  ame>0 );.    pPa
2b600 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
2b610 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2b620 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20  = nPathname + 1 
2b630 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  + nUri);.    mem
2b640 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
2b650 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
2b660 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2b670 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2b680 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
2b690 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20  hname+1], zUri, 
2b6a0 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2b6b0 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
2b6c0 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2b6d0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2b6e0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2b6f0 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2b700 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  e], "-journal", 
2b710 38 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  8);.    sqlite3F
2b720 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2b730 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2b740 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
2b750 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b760 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61  OMIT_WAL.    pPa
2b770 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61  ger->zWal = &pPa
2b780 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2b790 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20  athname+8+1];.  
2b7a0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2b7b0 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  >zWal, zPathname
2b7c0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2b7d0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2b7e0 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ->zWal[nPathname
2b7f0 5d 2c 20 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 20  ], "-wal", 4);. 
2b800 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2b810 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2b820 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2b830 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20  >zWal);.#endif. 
2b840 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2b850 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
2b860 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
2b870 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
2b880 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
2b890 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
2b8a0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2b8b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2b8c0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2b8d0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
2b8e0 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
2b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b900 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
2b910 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
2b920 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2b930 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2b940 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2b950 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
2b960 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
2b970 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d      assert( !mem
2b980 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  Db );.    readOn
2b990 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
2b9a0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2b9b0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2b9c0 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
2b9d0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
2b9e0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2b9f0 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
2ba00 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
2ba10 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
2ba20 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
2ba30 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2ba40 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
2ba50 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2ba60 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2ba70 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
2ba80 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
2ba90 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
2baa0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2bab0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
2bac0 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
2bad0 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
2bae0 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
2baf0 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
2bb00 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
2bb10 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
2bb20 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2bb30 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
2bb40 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65  Only ){.      se
2bb50 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2bb60 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
2bb70 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
2bb80 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
2bb90 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2bba0 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
2bbb0 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2bbc0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2bbd0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ze ){.        if
2bbe0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
2bbf0 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
2bc00 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2bc10 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2bc20 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2bc30 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2bc40 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
2bc50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bc60 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2bc70 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63  (u32)pPager->sec
2bc80 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
2bc90 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65   }.      }.#ifde
2bca0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2bcb0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2bcc0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74     {.        int
2bcd0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
2bce0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2bcf0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
2bd00 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
2bd10 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  i;.        asser
2bd20 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2bd30 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
2bd40 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
2bd50 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2bd60 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
2bd70 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
2bd80 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
2bd90 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2bda0 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
2bdb0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
2bdc0 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
2bdd0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2bde0 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
2bdf0 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  *2){.          i
2be00 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2be10 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2be20 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2be30 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2be40 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ii;.          }
2be50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2be60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2be70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2be80 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
2be90 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
2bea0 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
2beb0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
2bec0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2bed0 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
2bee0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2bef0 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
2bf00 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
2bf10 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
2bf20 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
2bf30 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
2bf40 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2bf50 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
2bf60 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
2bf70 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2bf80 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
2bf90 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2bfa0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
2bfb0 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
2bfc0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2bfd0 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
2bfe0 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
2bff0 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
2c000 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
2c010 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  */ .    tempFile
2c020 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2c030 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
2c040 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61  _READER;.    pPa
2c050 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43  ger->eLock = EXC
2c060 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
2c070 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
2c080 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2c090 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
2c0a0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2c0b0 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
2c0c0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
2c0d0 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
2c0e0 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
2c0f0 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2c100 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
2c110 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
2c120 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
2c130 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c140 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2c150 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
2c160 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
2c170 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2c180 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
2c190 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
2c1a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2c1b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c1c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
2c1d0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2c1e0 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
2c1f0 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
2c200 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50  free the .  ** P
2c210 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
2c220 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
2c230 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
2c240 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c250 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2c260 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b  er->pTmpSpace );
2c270 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2c280 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2c290 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2c2a0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
2c2b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2c2c0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2c2d0 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
2c2e0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  . */.  assert( n
2c2f0 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20  Extra<1000 );.  
2c300 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
2c310 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74  nExtra);.  sqlit
2c320 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
2c330 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
2c340 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
2c360 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
2c370 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
2c380 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
2c390 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
2c3a0 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
2c3b0 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
2c3c0 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
2c3d0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2c3e0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
2c3f0 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
2c400 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
2c410 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
2c420 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2c430 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
2c440 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
2c450 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64  adlock = (noRead
2c460 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
2c470 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61  ) ?1:0;.  /* pPa
2c480 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
2c490 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2c4a0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
2c4b0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2c4c0 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
2c4d0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2c4e0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2c4f0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
2c500 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2c510 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
2c520 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2c530 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
2c540 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
2c550 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2c560 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
2c570 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  CK; */.#if 0.  a
2c580 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2c590 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c  tate == (tempFil
2c5a0 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e ? PAGER_EXCLUS
2c5b0 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f  IVE : PAGER_UNLO
2c5c0 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  CK) );.#endif.  
2c5d0 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
2c5e0 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
2c5f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
2c600 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
2c610 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
2c620 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2c630 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
2c640 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
2c650 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2c660 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
2c670 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2c680 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2c690 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
2c6a0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2c6b0 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
2c6c0 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
2c6d0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2c6e0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2c6f0 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
2c700 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
2c710 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
2c720 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
2c730 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75  nly;.  assert( u
2c740 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61  seJournal || pPa
2c750 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2c760 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
2c770 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
2c780 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
2c790 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65  fullSync = pPage
2c7a0 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a  r->noSync ?0:1;.
2c7b0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
2c7c0 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ags = pPager->no
2c7d0 53 79 6e 63 20 3f 20 30 20 3a 20 53 51 4c 49 54  Sync ? 0 : SQLIT
2c7e0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 23  E_SYNC_NORMAL;.#
2c7f0 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
2c800 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a  T_CKPTFULLFSYNC.
2c810 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
2c820 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
2c830 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 53  ->noSync ? 0 : S
2c840 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
2c850 0a 23 65 6c 73 65 0a 20 20 70 50 61 67 65 72 2d  .#else.  pPager-
2c860 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
2c870 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2c880 67 73 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20  gs;.#endif.  /* 
2c890 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
2c8a0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2c8b0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
2c8c0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2c8d0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
2c8e0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
2c8f0 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74  xtra = (u16)nExt
2c900 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
2c910 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
2c920 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2c930 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
2c940 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  IT;.  assert( is
2c950 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2c960 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a   || tempFile );.
2c970 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2c980 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
2c990 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
2c9a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2c9b0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2c9c0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20  URNALMODE_OFF;. 
2c9d0 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62   }else if( memDb
2c9e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2c9f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2ca00 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2ca10 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a  MEMORY;.  }.  /*
2ca20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
2ca30 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
2ca40 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
2ca50 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20  HandlerArg = 0; 
2ca60 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  */.  pPager->xRe
2ca70 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
2ca80 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  ;.  /* memset(pP
2ca90 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
2caa0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
2cab0 48 61 73 68 29 29 3b 20 2a 2f 0a 23 69 66 6e 64  Hash)); */.#ifnd
2cac0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
2cad0 45 52 47 45 5f 53 4f 52 54 0a 20 20 69 66 28 20  ERGE_SORT.  if( 
2cae0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 4f  flags & PAGER_SO
2caf0 52 54 45 52 20 29 7b 0a 20 20 20 20 70 50 61 67  RTER ){.    pPag
2cb00 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 3d  er->doNotSpill =
2cb10 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2cb20 69 73 53 6f 72 74 65 72 20 3d 20 31 3b 0a 20 20  isSorter = 1;.  
2cb30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 70 50  }.#endif..  *ppP
2cb40 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
2cb50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cb60 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  K;.}..../*.** Th
2cb70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2cb80 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
2cb90 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
2cba0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
2cbb0 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
2cbc0 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
2cbd0 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
2cbe0 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
2cbf0 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
2cc00 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
2cc10 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
2cc20 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
2cc30 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
2cc40 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2cc50 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
2cc60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2cc70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
2cc80 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
2cc90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
2cca0 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
2ccb0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
2ccc0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2ccd0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
2cce0 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
2ccf0 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
2cd00 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
2cd10 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2cd20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd30 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2cd40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2cd50 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
2cd60 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
2cd70 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
2cd80 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
2cd90 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2cda0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2cdb0 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
2cdc0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
2cdd0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
2cde0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
2cdf0 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
2ce00 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
2ce10 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
2ce20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
2ce30 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
2ce40 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
2ce50 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2ce60 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
2ce70 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2ce80 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
2ce90 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
2cea0 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
2ceb0 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
2cec0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2ced0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2cee0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2cef0 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
2cf00 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
2cf10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
2cf20 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
2cf30 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
2cf40 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
2cf50 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
2cf60 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
2cf70 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
2cf80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2cf90 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2cfa0 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
2cfb0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2cfc0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
2cfd0 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
2cfe0 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
2cff0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
2d000 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
2d010 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d020 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2d030 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
2d040 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
2d050 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
2d060 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2d070 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
2d080 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
2d090 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
2d0a0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2d0b0 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
2d0c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2d0d0 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
2d0e0 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
2d0f0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
2d100 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2d110 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2d120 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
2d130 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
2d140 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
2d150 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2d160 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
2d170 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
2d180 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
2d190 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
2d1a0 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
2d1b0 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
2d1c0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
2d1d0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
2d1e0 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
2d1f0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
2d200 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
2d210 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2d220 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2d230 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2d240 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
2d250 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2d260 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2d270 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2d280 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
2d290 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
2d2a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2d2b0 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
2d2c0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2d2d0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  l );.  assert( i
2d2e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2d2f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2d300 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2d310 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20  AGER_OPEN );..  
2d320 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e  assert( jrnlOpen
2d330 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33  ==0 || ( sqlite3
2d340 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2d350 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2d360 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54  jfd) &.    SQLIT
2d370 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
2d380 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20  BLE_WHEN_OPEN.  
2d390 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20  ));..  *pExists 
2d3a0 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c  = 0;.  if( !jrnl
2d3b0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
2d3c0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2d3d0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2d3e0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
2d3f0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
2d400 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69  exists);.  }.  i
2d410 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d420 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
2d430 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
2d440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d450 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72   True if some pr
2d460 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2d470 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a  SERVED lock */..
2d480 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64      /* Race cond
2d490 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f  ition here:  Ano
2d4a0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2d4b0 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c  ht have been hol
2d4c0 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  ding the.    ** 
2d4d0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2d4e0 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75  k and have a jou
2d4f0 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65  rnal open at the
2d500 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2d510 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  () .    ** call 
2d520 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20  above, but then 
2d530 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2d540 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20  al and drop the 
2d550 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20  lock before.    
2d560 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65  ** we get to the
2d570 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
2d580 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2d590 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49  dLock() call.  I
2d5a0 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  f that.    ** is
2d5b0 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20   the case, this 
2d5c0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68  routine might th
2d5d0 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68  ink there is a h
2d5e0 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a  ot journal when.
2d5f0 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74      ** in fact t
2d600 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54  here is none.  T
2d610 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61  his results in a
2d620 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
2d630 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  which will.    *
2d640 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
2d650 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  by the playback 
2d660 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74  routine.  Ticket
2d670 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20   #3883..    */. 
2d680 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2d690 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2d6a0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
2d6b0 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28  locked);.    if(
2d6c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2d6d0 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
2d6e0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
2d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d700 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2d710 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
2d720 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  le */..      /* 
2d730 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f  Check the size o
2d740 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2d750 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69  ile. If it consi
2d760 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a  sts of 0 pages,.
2d770 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65        ** then de
2d780 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2d790 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68   file. See the h
2d7a0 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62  eader comment ab
2d7b0 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a  ove for .      *
2d7c0 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20  * the reasoning 
2d7d0 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68  here.  Delete th
2d7e0 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  e obsolete journ
2d7f0 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20  al file under.  
2d800 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45      ** a RESERVE
2d810 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20  D lock to avoid 
2d820 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  race conditions 
2d830 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f  and to avoid vio
2d840 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lating.      ** 
2d850 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20  [H33020]..      
2d860 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2d870 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2d880 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
2d890 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d8a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d8b0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
2d8c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2d8d0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
2d8e0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
2d8f0 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
2d900 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
2d910 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
2d920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2d930 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
2d940 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
2d950 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
2d960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2d970 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2d980 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f  Mode ) pagerUnlo
2d990 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
2d9a0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
2d9b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d9c0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
2d9d0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
2d9e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d9f0 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
2da00 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2da10 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  nd no other conn
2da20 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73  ection has a res
2da30 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  erved.          
2da40 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ** or greater lo
2da50 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2da60 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65  se file. Now che
2da70 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ck that there is
2da80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74  .          ** at
2da90 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a   least one non-z
2daa0 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
2dab0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
2dac0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
2dad0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72        ** If ther
2dae0 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f  e is, then we co
2daf0 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72  nsider this jour
2db00 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49  nal to be hot. I
2db10 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20  f not, .        
2db20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69    ** it can be i
2db30 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20  gnored..        
2db40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
2db50 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
2db60 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2db70 66 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f  f = .#if SQLITE_
2db80 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
2db90 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  ECTION.         
2dba0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66       (pPager->vf
2dbb0 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2dbc0 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f  EN_FILEPROTECTIO
2dbd0 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a  N_MASK)|.#endif.
2dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
2dbf0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2dc00 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
2dc10 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
2dc20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2dc30 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
2dc40 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2dc50 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
2dc60 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
2dc70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2dc80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2dc90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dca0 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  u8 first = 0;.  
2dcb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2dcc0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
2dcd0 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20  ger->jfd, (void 
2dce0 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b  *)&first, 1, 0);
2dcf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2dd00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
2dd10 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
2dd30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2dd40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2dd50 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
2dd60 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
2dd70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
2dd80 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
2dd90 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
2dda0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  }.            *p
2ddb0 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
2ddc0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
2ddd0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2dde0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
2ddf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2de00 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  f we cannot open
2de10 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
2de20 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72  urnal file in or
2de30 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20  der to see if.  
2de40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73            ** its
2de50 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64   has a zero head
2de60 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62  er, that might b
2de70 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20  e due to an I/O 
2de80 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20  error, or.      
2de90 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
2dea0 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20  t be due to the 
2deb0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64  race condition d
2dec0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61  escribed above a
2ded0 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nd in.          
2dee0 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38    ** ticket #388
2def0 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  3.  Either way, 
2df00 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
2df10 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a  journal is hot..
2df20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54              ** T
2df30 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66  his might be a f
2df40 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20  alse positive.  
2df50 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68  But if it is, th
2df60 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  en the.         
2df70 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
2df80 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
2df90 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65   and recovery me
2dfa0 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61  chanism will dea
2dfb0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
2dfc0 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61   with it under a
2dfd0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2dfe0 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
2dff0 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
2e000 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f       ** worry so
2e010 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20   much with race 
2e020 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20  conditions..    
2e030 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e040 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2e050 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2e060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e070 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2e090 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2e0a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e0b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2e0c0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
2e0d0 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
2e0e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2e0f0 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69  file..** It is i
2e100 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73  llegal to call s
2e110 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
2e120 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72  re() until after
2e130 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
2e140 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65  * has been succe
2e150 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20  ssfully called. 
2e160 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  If a shared-lock
2e170 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
2e180 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   when.** this fu
2e190 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2e1a0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
2e1b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
2e1c0 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  wing operations 
2e1d0 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d  are also perform
2e1e0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2e1f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ion..**.**   1) 
2e200 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2e210 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47  currently in PAG
2e220 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e  ER_OPEN state (n
2e230 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20  o lock held.**  
2e240 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
2e250 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20  ase file), then 
2e260 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
2e270 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a  de to obtain a.*
2e280 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f  *      SHARED lo
2e290 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2e2a0 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61  se file. Immedia
2e2b0 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
2e2c0 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ning.**      the
2e2d0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
2e2e0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73  e file-system is
2e2f0 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68   checked for a h
2e300 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20  ot-journal,.**  
2e310 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61      which is pla
2e320 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73  yed back if pres
2e330 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61  ent. Following a
2e340 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a  ny hot-journal .
2e350 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
2e360 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
2e370 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20  f the cache are 
2e380 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65  validated by che
2e390 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  cking.**      th
2e3a0 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  e 'change-counte
2e3b0 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  r' field of the 
2e3c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
2e3d0 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ader and.**     
2e3e0 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68   discarded if th
2e3f0 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20  ey are found to 
2e400 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  be invalid..**.*
2e410 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61  *   2) If the pa
2e420 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
2e430 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
2e440 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
2e450 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
2e460 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67    no outstanding
2e470 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
2e480 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73  ny pages, and is
2e490 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2e4a0 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65  ate,.**      the
2e4b0 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
2e4c0 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68  made to clear th
2e4d0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79  e error state by
2e4e0 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20   discarding.**  
2e4f0 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73      the contents
2e500 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63   of the page cac
2e510 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62  he and rolling b
2e520 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75  ack any open jou
2e530 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c  rnal.**      fil
2e540 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
2e550 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
2e560 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
2e570 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
2e580 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
2e590 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63  occurs while loc
2e5a0 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  king the databas
2e5b0 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  e, checking for 
2e5c0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2e5d0 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e  le or .** rollin
2e5e0 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
2e5f0 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72   file, the IO er
2e600 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2e610 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
2e620 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
2e630 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
2e640 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2e650 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2e660 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e670 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
2e680 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2e690 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
2e6a0 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c  m b-tree and onl
2e6b0 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  y when there are
2e6c0 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e   no.  ** outstan
2e6d0 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73  ding pages. This
2e6e0 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
2e6f0 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73 68  e pager state sh
2e700 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a  ould either.  **
2e710 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44   be OPEN or READ
2e720 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e  ER. READER is on
2e730 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74  ly possible if t
2e740 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20 77  he pager is or w
2e750 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c  as in .  ** excl
2e760 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
2e770 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
2e780 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
2e790 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
2e7a0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
2e7b0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
2e7c0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
2e7d0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
2e7e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2e7f0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
2e800 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2e810 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
2e820 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42   if( NEVER(MEMDB
2e830 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
2e840 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70  ode) ){ return p
2e850 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20  Pager->errCode; 
2e860 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  }..  if( !pagerU
2e870 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
2e880 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2e890 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
2e8a0 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e     int bHotJourn
2e8b0 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  al = 1;         
2e8c0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
2e8d0 65 20 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a  e exists a hot j
2e8e0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a  ournal-file */..
2e8f0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
2e900 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
2e910 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64  ( pPager->noRead
2e920 6c 6f 63 6b 3d 3d 30 20 7c 7c 20 70 50 61 67 65  lock==0 || pPage
2e930 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a  r->readOnly );..
2e940 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2e950 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 29 7b  noReadlock==0 ){
2e960 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2e970 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
2e980 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
2e990 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
2e9a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e9b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e9c0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
2e9d0 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  O_LOCK || pPager
2e9e0 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
2e9f0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
2ea00 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2ea10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2ea20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
2ea30 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
2ea40 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
2ea50 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
2ea60 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2ea70 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
2ea80 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
2ea90 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
2eaa0 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
2eab0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
2eac0 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  r->eLock<=SHARED
2ead0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
2eae0 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
2eaf0 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a  l(pPager, &bHotJ
2eb00 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ournal);.    }. 
2eb10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2eb20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
2eb30 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  to failed;.    }
2eb40 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75  .    if( bHotJou
2eb50 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rnal ){.      /*
2eb60 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
2eb70 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
2eb80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
2eb90 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
2eba0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
2ebb0 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
2ebc0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
2ebd0 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
2ebe0 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
2ebf0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
2ec00 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
2ec10 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
2ec20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
2ec30 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
2ec40 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
2ec50 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
2ec60 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
2ec70 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
2ec80 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
2ec90 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
2eca0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
2ecb0 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
2ecc0 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
2ecd0 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
2ece0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
2ecf0 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
2ed00 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
2ed10 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
2ed20 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
2ed30 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
2ed40 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
2ed50 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
2ed60 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
2ed70 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
2ed80 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
2ed90 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
2eda0 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
2edb0 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
2edc0 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
2edd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ede0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2edf0 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   ** Unless the p
2ee00 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69  ager is in locki
2ee10 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2ee20 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  e mode, the lock
2ee30 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77   is.      ** dow
2ee40 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45  ngraded to SHARE
2ee50 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68  D_LOCK before th
2ee60 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2ee70 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rns..      */.  
2ee80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
2ee90 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
2eea0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2eeb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2eec0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2eed0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2eee0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
2eef0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
2ef00 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74  ready open and t
2ef10 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f  he file exists o
2ef20 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65  n disk, open the
2ef30 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
2ef40 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
2ef50 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20  e access. Write 
2ef60 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72  access is requir
2ef70 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20  ed because .    
2ef80 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76    ** in exclusiv
2ef90 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
2efa0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2efb0 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
2efc0 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  pen .      ** an
2efd0 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  d possibly used 
2efe0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
2eff0 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f  n later on. Also
2f000 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a  , write-access .
2f010 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61        ** is usua
2f020 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  lly required to 
2f030 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
2f040 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  rnal in journal_
2f050 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20  mode=persist .  
2f060 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64      ** mode (and
2f070 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61   also for journa
2f080 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20  l_mode=truncate 
2f090 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29  on some systems)
2f0a0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2f0b0 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   ** If the journ
2f0c0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
2f0d0 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
2f0e0 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
2f0f0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f       ** other co
2f100 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64  nnection managed
2f110 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72   to get in and r
2f120 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f  oll it back befo
2f130 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  re .      ** thi
2f140 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
2f150 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
2f160 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
2f170 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  Or, it .      **
2f180 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74   may mean that t
2f190 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
2f1a0 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
2f1b0 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20  when this.      
2f1c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
2f1d0 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a  called and the j
2f1e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
2f1f0 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
2f200 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
2f210 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2f220 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fd) ){.        s
2f230 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2f240 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2f250 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20  ->pVfs;.        
2f260 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20  int bExists;    
2f270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f280 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
2f290 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
2f2a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f2b0 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
2f2c0 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
2f2d0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
2f2e0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2f2f0 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20  TS, &bExists);. 
2f300 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2f310 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69  QLITE_OK && bExi
2f320 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sts ){.         
2f330 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
2f340 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
2f350 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
2f360 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
2f370 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ION.            
2f380 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67  (pPager->vfsFlag
2f390 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49  s&SQLITE_OPEN_FI
2f3a0 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53  LEPROTECTION_MAS
2f3b0 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  K)|.#endif.     
2f3c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
2f3d0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
2f3e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2f3f0 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
2f400 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2f410 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
2f420 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f430 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2f440 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2f450 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
2f460 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
2f470 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
2f480 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
2f490 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2f4a0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
2f4b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f4c0 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
2f4d0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
2f4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2f4f0 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
2f500 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
2f510 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2f520 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
2f530 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f550 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
2f560 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
2f570 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
2f580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
2f590 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
2f5a0 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
2f5b0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
2f5c0 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
2f5d0 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
2f5e0 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
2f5f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
2f600 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
2f610 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
2f620 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
2f630 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74  t cache.  Sync t
2f640 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62  he hot journal b
2f650 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20  efore playing.  
2f660 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73      ** it back s
2f670 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73  ince the process
2f680 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e   that crashed an
2f690 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a  d left the hot j
2f6a0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
2f6b0 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74  probably did not
2f6c0 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20   sync it and we 
2f6d0 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
2f6e0 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20  always sync.    
2f6f0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
2f700 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20   before playing 
2f710 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  it back..      *
2f720 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  /.      if( isOp
2f730 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2f740 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2f750 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2f760 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
2f770 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
2f780 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
2f790 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f7a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f7b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2f7c0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
2f7d0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   1);.          p
2f7e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2f7f0 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
2f800 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2f810 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
2f820 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
2f830 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c          pagerUnl
2f840 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
2f850 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
2f860 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
2f870 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f880 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2f890 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
2f8a0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
2f8b0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2f8c0 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  to open.        
2f8d0 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20  ** or roll back 
2f8e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68  a hot-journal wh
2f8f0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ile holding an E
2f900 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
2f910 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
2f920 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75  ger_unlock() rou
2f930 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
2f940 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  led before retur
2f950 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20  ning to unlock. 
2f960 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69         ** the fi
2f970 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63  le. If the unloc
2f980 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c  k attempt fails,
2f990 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63   then Pager.eLoc
2f9a0 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20  k must be.      
2f9b0 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e    ** set to UNKN
2f9c0 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68  OWN_LOCK (see th
2f9d0 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
2f9e0 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20  the #define for 
2f9f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e  .        ** UNKN
2fa00 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66  OWN_LOCK above f
2fa10 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
2fa20 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  n). .        **.
2fa30 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72          ** In or
2fa40 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72  der to get pager
2fa50 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20  _unlock() to do 
2fa60 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e  this, set Pager.
2fa70 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20  eState to.      
2fa80 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
2fa90 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f   now. This is no
2faa0 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74  t actually count
2fab0 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69  ed as a transiti
2fac0 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  on.        ** to
2fad0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20   ERROR state in 
2fae0 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61  the state diagra
2faf0 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  m at the top of 
2fb00 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20  this file,.     
2fb10 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
2fb20 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d  now that the sam
2fb30 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
2fb40 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65  unlock() will ve
2fb50 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68  ry.        ** sh
2fb60 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e  ortly transition
2fb70 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2fb80 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74  t to the OPEN st
2fb90 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20  ate. Calling.   
2fba0 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70       ** assert_p
2fbb0 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75  ager_state() wou
2fbc0 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20  ld fail now, as 
2fbd0 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
2fbe0 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
2fbf0 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52    ** to be in ER
2fc00 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
2fc10 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75  here are zero ou
2fc20 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a  tstanding page .
2fc30 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72          ** refer
2fc40 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ences..        *
2fc50 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  /.        pager_
2fc60 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2fc70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
2fc80 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
2fc90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2fca0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2fcb0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
2fcc0 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
2fcd0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  er->eLock==SHARE
2fce0 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20  D_LOCK).        
2fcf0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
2fd00 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
2fd10 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48  pPager->eLock>SH
2fd20 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
2fd30 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
2fd40 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
2fd50 46 69 6c 65 20 0a 20 20 20 20 20 26 26 20 28 70  File .     && (p
2fd60 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c  Pager->pBackup |
2fd70 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  | sqlite3PcacheP
2fd80 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
2fd90 3e 70 50 43 61 63 68 65 29 3e 30 29 20 0a 20 20  >pPCache)>0) .  
2fda0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
2fdb0 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
2fdc0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
2fdd0 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ired on the data
2fde0 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20  base file.      
2fdf0 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
2fe00 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
2fe10 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
2fe20 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
2fe30 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
2fe40 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
2fe50 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
2fe60 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
2fe70 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
2fe80 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
2fe90 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
2fea0 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
2feb0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
2fec0 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  he..      **.   
2fed0 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
2fee0 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74  hanges is detect
2fef0 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
2ff00 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
2ff10 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ing.      ** at 
2ff20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74  offset 24 into t
2ff30 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69  he file.  The fi
2ff40 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31  rst 4 of these 1
2ff50 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  6 bytes are.    
2ff60 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
2ff70 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
2ff80 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
2ff90 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
2ffa0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
2ffb0 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
2ffc0 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
2ffd0 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
2ffe0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65  .      ** a code
2fff0 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
30000 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
30010 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73  There is a vanis
30020 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61  hingly small cha
30030 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67  nce that a chang
30040 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20  e will not be . 
30050 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
30060 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
30070 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
30080 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
30090 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  l that.      ** 
300a0 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
300b0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
300c0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d      Pgno nPage =
300d0 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64   0;.      char d
300e0 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
300f0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
30100 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63  ers)];..      rc
30110 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
30120 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
30130 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
30140 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a  ) goto failed;..
30150 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e        if( nPage>
30160 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54  0 ){.        IOT
30170 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
30180 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
30190 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
301a0 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  s)));.        rc
301b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
301c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
301d0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
301e0 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
301f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
30200 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30210 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
30220 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
30230 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30240 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46        memset(dbF
30250 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65  ileVers, 0, size
30260 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
30270 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
30280 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65  if( memcmp(pPage
30290 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
302a0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
302b0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d  f(dbFileVers))!=
302c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  0 ){.        pag
302d0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
302e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
302f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
30300 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
30310 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
30320 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
30330 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
30340 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
30350 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
30360 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
30370 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
30380 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
30390 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
303a0 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e  nt(pPager);.#ifn
303b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
303c0 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20  WAL.    assert( 
303d0 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20  pPager->pWal==0 
303e0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
303f0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a   );.#endif.  }..
30400 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
30410 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
30420 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
30430 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
30440 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61   = pagerBeginRea
30450 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
30460 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
30470 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
30480 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72  =PAGER_OPEN && r
30490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
304a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
304b0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
304c0 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  &pPager->dbSize)
304d0 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
304e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
304f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
30500 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
30510 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
30520 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
30530 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
30540 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
30550 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
30560 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
30570 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d  AGER_READER;.  }
30580 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30590 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
305a0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
305b0 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
305c0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
305d0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
305e0 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
305f0 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
30600 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
30610 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
30620 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
30630 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
30640 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
30650 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
30660 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
30670 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
30680 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
30690 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
306a0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
306b0 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
306c0 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
306d0 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
306e0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71  ager){.  if( (sq
306f0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
30700 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
30710 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  che)==0) ){.    
30720 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
30730 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
30740 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71    }.}../*.** Acq
30750 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
30760 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
30770 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50  pgno in pager pP
30780 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20  ager (a page.** 
30790 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79  reference has ty
307a0 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20  pe DbPage*). If 
307b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
307c0 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73  ference is .** s
307d0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61  uccessfully obta
307e0 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69  ined, it is copi
307f0 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e  ed to *ppPage an
30800 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
30810 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
30820 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
30830 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
30840 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73  the cache, it is
30850 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
30860 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20  therwise, a new 
30870 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61  page object is a
30880 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
30890 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ulated with data
308a0 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68  .** read from th
308b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
308c0 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
308d0 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
308e0 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20  e may.** choose 
308f0 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  not to allocate 
30900 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
30910 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20  t and may reuse 
30920 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f  an existing.** o
30930 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75  bject with no ou
30940 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
30950 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nces..**.** The 
30960 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
30970 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
30980 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
30990 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  zed to zeros the
309a0 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20   .** first time 
309b0 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
309c0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66   into memory. If
309d0 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73   the page reques
309e0 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61  ted is .** alrea
309f0 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  dy in the cache 
30a00 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
30a10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
30a20 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20  en the extra.** 
30a30 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20  data is left as 
30a40 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  it was when the 
30a50 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20  page object was 
30a60 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  last used..**.**
30a70 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
30a80 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65   image is smalle
30a90 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
30aa0 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20  sted page or if 
30ab0 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76  a .** non-zero v
30ac0 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61  alue is passed a
30ad0 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  s the noContent 
30ae0 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68  parameter and th
30af0 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
30b00 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
30b10 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ady stored in th
30b20 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f  e cache, then no
30b30 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b   .** actual disk
30b40 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e   read occurs. In
30b50 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d   this case the m
30b60 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
30b70 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69  he .** page is i
30b80 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
30b90 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20  l zeros. .**.** 
30ba0 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
30bb0 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
30bc0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
30bd0 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  re about the con
30be0 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tents.** of the 
30bf0 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72  page. This occur
30c00 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74  s in two seperat
30c10 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a  e scenarios:.**.
30c20 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61  **   a) When rea
30c30 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74  ding a free-list
30c40 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20   leaf page from 
30c50 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e  the database, an
30c60 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65  d.**.**   b) Whe
30c70 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73  n a savepoint is
30c80 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
30c90 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  ck and we need t
30ca0 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61  o load.**      a
30cb0 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74   new page into t
30cc0 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66  he cache to be f
30cd0 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
30ce0 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  ata read.**     
30cf0 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f   from the savepo
30d00 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  int journal..**.
30d10 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
30d20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
30d30 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
30d40 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
30d50 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65  d of.** being re
30d60 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
30d70 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
30d80 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
30d90 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
30da0 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
30db0 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
30dc0 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
30dd0 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
30de0 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
30df0 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
30e00 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
30e10 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
30e20 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
30e30 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
30e40 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
30e50 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
30e60 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
30e70 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
30e80 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
30e90 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
30ea0 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
30eb0 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
30ec0 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
30ed0 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
30ee0 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
30ef0 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
30f00 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
30f10 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
30f20 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
30f30 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
30f40 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
30f50 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
30f60 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
30f70 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
30f80 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
30f90 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
30fa0 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
30fb0 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
30fc0 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
30fd0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
30fe0 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
30ff0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
31000 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
31010 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
31020 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
31030 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
31040 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
31050 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
31060 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
31070 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
31080 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
31090 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
310a0 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
310b0 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
310c0 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
310d0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
310e0 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
310f0 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
31100 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
31110 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
31120 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
31130 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
31140 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
31150 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
31160 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
31170 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
31180 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31190 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
311a0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
311b0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
311c0 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
311d0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
311e0 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
311f0 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
31200 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
31210 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
31220 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
31230 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
31240 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
31250 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
31260 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
31270 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31280 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
31290 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
312a0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
312b0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
312c0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
312d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
312e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
312f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
31300 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
31310 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
31320 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
31330 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20  immediately. .  
31340 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
31350 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66  quest the page f
31360 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c  rom the PCache l
31370 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ayer. */.  if( p
31380 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
31390 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
313a0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
313b0 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rCode;.  }else{.
313c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
313d0 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
313e0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
313f0 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20  o, 1, ppPage);. 
31400 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
31410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
31420 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c  * Either the cal
31430 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63  l to sqlite3Pcac
31440 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e  heFetch() return
31450 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74  ed an error or t
31460 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
31470 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  was already in t
31480 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
31490 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
314a0 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  n was called..  
314b0 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20    ** Set pPg to 
314c0 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68  0 and jump to th
314d0 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64  e exception hand
314e0 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67  ler.  */.    pPg
314f0 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70   = 0;.    goto p
31500 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
31510 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
31520 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
31530 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
31540 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  t( (*ppPage)->pP
31550 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
31560 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
31570 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  r==0 );..  if( (
31580 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
31590 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29   && !noContent )
315a0 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
315b0 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65   case the pcache
315c0 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
315d0 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  s an initialized
315e0 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20   copy of.    ** 
315f0 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e  the page. Return
31600 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72   without further
31610 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73   ado.  */.    as
31620 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45  sert( pgno<=PAGE
31630 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67  R_MAX_PGNO && pg
31640 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
31650 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
31660 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
31670 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72  er->nHit);.    r
31680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31690 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
316a0 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68  * The pager cach
316b0 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20  e has created a 
316c0 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f  new page. Its co
316d0 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a  ntent needs to .
316e0 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61      ** be initia
316f0 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20  lized.  */..    
31700 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
31710 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70  r->nMiss);.    p
31720 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20  Pg = *ppPage;.  
31730 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
31740 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  pPager;..    /* 
31750 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
31760 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
31770 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
31780 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
31790 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  .    ** number g
317a0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
317b0 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20  , or the unused 
317c0 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73  locking-page, is
317d0 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20   requested. */. 
317e0 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45     if( pgno>PAGE
317f0 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
31800 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
31810 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
31820 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31830 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
31840 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
31850 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
31860 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ..    if( MEMDB 
31870 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
31880 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  e<pgno || noCont
31890 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ent || !isOpen(p
318a0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
318b0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
318c0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
318d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
318e0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
318f0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
31900 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
31910 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
31920 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
31930 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
31940 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
31950 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
31960 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
31970 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
31980 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
31990 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
319a0 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
319b0 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
319c0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
319d0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
319e0 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
319f0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
31a00 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
31a10 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
31a20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
31a30 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
31a40 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
31a50 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
31a60 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
31a70 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
31a80 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
31a90 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
31aa0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
31ab0 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
31ac0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
31ad0 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
31ae0 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
31af0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
31b00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
31b10 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
31b20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
31b30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
31b40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31b50 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
31b60 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
31b70 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
31b80 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
31b90 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
31ba0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
31bb0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
31bc0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
31bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
31be0 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
31bf0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
31c00 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
31c10 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
31c20 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
31c30 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
31c40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
31c50 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
31c60 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   );.      rc = r
31c70 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
31c80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31ca0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
31cb0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
31cc0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
31cd0 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
31ce0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
31cf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
31d00 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
31d10 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  r:.  assert( rc!
31d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
31d30 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73  if( pPg ){.    s
31d40 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
31d50 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
31d60 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
31d70 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70  (pPager);..  *pp
31d80 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Page = 0;.  retu
31d90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
31da0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
31db0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
31dc0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
31dd0 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
31de0 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
31df0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
31e00 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
31e10 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
31e20 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
31e30 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
31e40 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
31e50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
31e60 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
31e70 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
31e80 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
31e90 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
31ea0 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
31eb0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
31ec0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
31ed0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
31ee0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
31ef0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
31f00 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
31f10 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
31f20 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
31f30 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
31f40 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
31f50 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
31f60 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
31f70 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
31f80 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
31f90 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
31fa0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
31fb0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
31fc0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
31fd0 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
31fe0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31ff0 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
32000 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32010 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
32020 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72  READER && pPager
32030 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
32040 45 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c 69 74  ERROR );.  sqlit
32050 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
32060 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
32070 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
32080 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
32090 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
320a0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
320b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
320c0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
320d0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
320e0 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
320f0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
32100 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
32110 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
32120 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
32130 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
32140 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
32150 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
32160 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
32170 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
32180 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
32190 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
321a0 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
321b0 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
321c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
321d0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
321e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
321f0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
32200 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
32210 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
32220 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
32230 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
32240 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
32250 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74  of every write t
32260 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
32270 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64  here must alread
32280 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20  y be a RESERVED 
32290 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
322a0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
322b0 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  e .** file when 
322c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
322d0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70  called..**.** Op
322e0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
322f0 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
32300 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61  ager and write a
32310 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
32320 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ** to the start 
32330 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  of it. If there 
32340 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
32350 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  oints, open the 
32360 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61  sub-journal.** a
32370 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  s well. This fun
32380 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
32390 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  ed when the jour
323a0 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e  nal file is bein
323b0 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20  g .** opened to 
323c0 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  write a rollback
323d0 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73   log for a trans
323e0 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f  action. It is no
323f0 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20  t used .** when 
32400 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f  opening a hot jo
32410 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f  urnal file to ro
32420 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
32430 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
32440 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
32450 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79   open (as it may
32460 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
32470 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20   mode),.** then 
32480 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75  this function ju
32490 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72  st writes a jour
324a0 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
324b0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
324c0 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66  * already open f
324d0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ile. .**.** Whet
324e0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
324f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
32500 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  pened by this fu
32510 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50  nction, the.** P
32520 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
32530 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
32540 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a   is allocated..*
32550 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
32560 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
32570 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
32580 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  l. Otherwise, re
32590 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
325a0 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74  NOMEM if the att
325b0 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
325c0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
325d0 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
325e0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
325f0 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77   if opening or w
32600 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
32610 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a  al file fails..*
32620 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
32630 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
32640 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32650 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
32660 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
32670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32680 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
32690 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
326a0 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
326b0 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c  er->pVfs;   /* L
326c0 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66  ocal cache of vf
326d0 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20  s pointer */..  
326e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
326f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
32700 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
32710 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
32720 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
32730 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
32740 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
32750 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f  nal==0 );.  .  /
32760 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20  * If already in 
32770 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
32780 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
32790 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  s a no-op.  But 
327a0 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65  on.  ** the othe
327b0 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75  r hand, this rou
327c0 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
327d0 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61  lled if we are a
327e0 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61  lready in.  ** a
327f0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a  n error state. *
32800 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
32810 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
32820 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
32830 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20  errCode;..  if( 
32840 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
32850 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
32860 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
32870 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
32880 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  FF ){.    pPager
32890 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
328a0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
328b0 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
328c0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
328d0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
328e0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
328f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
32900 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
32910 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
32920 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e   file if it is n
32930 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
32940 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f   */.    if( !isO
32950 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32960 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
32970 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
32980 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32990 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
329a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65         sqlite3Me
329b0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
329c0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
329d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
329e0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
329f0 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =               
32a00 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
32a10 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   to open journal
32a20 20 66 69 6c 65 20 2a 2f 0a 23 69 66 20 53 51 4c   file */.#if SQL
32a30 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
32a40 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20  PROTECTION.     
32a50 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66       (pPager->vf
32a60 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
32a70 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f  EN_FILEPROTECTIO
32a80 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a  N_MASK)|.#endif.
32a90 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
32aa0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
32ab0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
32ac0 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70  TE|.          (p
32ad0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
32ae0 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ? .            (
32af0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
32b00 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
32b10 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
32b20 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  AL):.           
32b30 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
32b40 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20  IN_JOURNAL).    
32b50 20 20 20 20 20 20 29 3b 0a 20 20 23 69 66 64 65        );.  #ifde
32b60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
32b70 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
32b80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32b90 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
32ba0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
32bb0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
32bc0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
32bd0 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
32be0 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
32bf0 20 20 20 20 20 29 3b 0a 20 20 23 65 6c 73 65 0a       );.  #else.
32c00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32c10 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
32c20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
32c30 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
32c40 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23 65 6e  flags, 0);.  #en
32c50 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
32c60 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
32c70 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
32c80 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
32c90 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20  ;.    }.  .  .  
32ca0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
32cb0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
32cc0 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
32cd0 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
32ce0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
32cf0 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
32d00 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
32d10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
32d30 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
32d40 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
32d50 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
32d60 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
32d70 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
32d80 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
32d90 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
32da0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
32db0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
32dc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
32dd0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
32de0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
32df0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
32e00 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
32e10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
32e20 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
32e30 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
32e40 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
32e50 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
32e60 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
32e70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32e80 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32e90 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
32ea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
32eb0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
32ec0 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d  ER_CACHEMOD;.  }
32ed0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
32ee0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
32ef0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
32f00 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
32f10 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
32f20 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
32f30 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
32f40 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
32f50 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
32f60 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
32f70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
32f80 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
32f90 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
32fa0 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
32fb0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
32fc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
32fd0 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
32fe0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
32ff0 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
33000 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
33010 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
33020 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
33030 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
33040 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
33050 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
33060 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
33070 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
33080 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
33090 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
330a0 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
330b0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
330c0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
330d0 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
330e0 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
330f0 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
33100 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
33110 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
33120 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
33130 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
33140 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
33150 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
33160 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
33170 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
33180 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
33190 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
331a0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
331b0 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
331c0 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
331d0 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
331e0 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
331f0 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
33200 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
33210 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
33220 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
33230 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
33240 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
33250 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
33260 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
33270 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
33280 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33290 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
332a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
332b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
332c0 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72  errCode;.  asser
332d0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
332e0 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
332f0 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
33300 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  e<PAGER_ERROR );
33310 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
33320 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
33330 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
33340 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  f( ALWAYS(pPager
33350 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
33360 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61  READER) ){.    a
33370 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
33380 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
33390 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
333a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
333b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
333c0 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
333d0 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
333e0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
333f0 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
33400 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
33410 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
33420 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
33430 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
33440 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
33450 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
33460 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
33470 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
33480 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
33490 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
334a0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
334b0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
334c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
334d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
334e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
334f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
33500 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
33510 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45       sqlite3WalE
33520 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
33530 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20  ger->pWal, 1);. 
33540 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
33550 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20   Grab the write 
33560 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20  lock on the log 
33570 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
33580 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a  ful, upgrade to.
33590 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52        ** PAGER_R
335a0 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f  ESERVED state. O
335b0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
335c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
335d0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
335e0 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d      ** The busy-
335f0 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69  handler is not i
33600 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65  nvoked if anothe
33610 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72  r connection alr
33620 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f  eady.      ** ho
33630 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  lds the write-lo
33640 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  ck. If possible,
33650 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
33660 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20   will call it.. 
33670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
33680 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
33690 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
336a0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
336b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
336c0 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
336d0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
336e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
336f0 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
33700 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
33710 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
33720 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
33730 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
33740 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
33750 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
33760 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
33770 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
33780 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
33790 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
337a0 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
337b0 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
337c0 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
337d0 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
337e0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
337f0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
33800 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
33810 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
33820 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c  QLITE_OK && exFl
33830 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ag ){.        rc
33840 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
33850 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
33860 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
33870 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
33880 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
338a0 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52  Change to WRITER
338b0 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20  _LOCKED state.. 
338c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
338d0 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50   WAL mode sets P
338e0 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50  ager.eState to P
338f0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
33900 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20  ED or CACHEMOD. 
33910 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20       ** when it 
33920 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  has an open tran
33930 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76  saction, but nev
33940 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46  er to DBMOD or F
33950 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a  INISHED..      *
33960 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
33970 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65  e in those state
33980 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  s the code to ro
33990 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  ll back savepoin
339a0 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
339b0 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70  sactions may cop
339c0 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  y data from the 
339d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f  sub-journal into
339e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
339f0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
33a00 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65  well as into the
33a10 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69   page cache. Whi
33a20 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f  ch would be inco
33a30 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20  rrect in .      
33a40 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20  ** WAL mode..   
33a50 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67     */.      pPag
33a60 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
33a70 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
33a80 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
33a90 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
33aa0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
33ab0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
33ac0 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
33ad0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
33ae0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
33af0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
33b00 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
33b10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
33b20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
33b30 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
33b40 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
33b50 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
33b60 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
33b70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
33b80 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
33b90 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
33ba0 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73  OCKED );.    ass
33bb0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
33bc0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
33bd0 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
33be0 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49  RACE(("TRANSACTI
33bf0 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
33c00 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72  D(pPager)));.  r
33c10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33c20 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
33c30 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
33c40 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
33c50 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
33c60 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
33c70 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
33c80 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
33c90 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
33ca0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
33cb0 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
33cc0 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
33cd0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
33ce0 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
33cf0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
33d00 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
33d10 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
33d20 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
33d30 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
33d40 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
33d50 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
33d60 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
33d70 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
33d80 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
33d90 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
33da0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
33db0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
33dc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33dd0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  _OK;..  /* This 
33de0 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63  routine is not c
33df0 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77  alled unless a w
33e00 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
33e10 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20   has already .  
33e20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e  ** been started.
33e30 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
33e40 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  e may or may not
33e50 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73   be open at this
33e60 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20   point..  ** It 
33e70 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
33e80 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
33e90 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  te..  */.  asser
33ea0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33eb0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
33ec0 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
33ed0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33ee0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
33ef0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
33f00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33f10 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
33f20 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
33f30 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
33f40 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
33f50 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
33f60 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65 76  or has been prev
33f70 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c  iously detected,
33f80 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65   report the same
33f90 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69   error.  ** agai
33fa0 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  n. This should n
33fb0 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74 20 74  ot happen, but t
33fc0 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69 64 65  he check provide
33fd0 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  s robustness. */
33fe0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
33ff0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
34000 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
34010 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48  errCode;..  /* H
34020 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74  igher-level rout
34030 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20  ines never call 
34040 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
34050 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
34060 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20  .  ** writable. 
34070 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61   But check anywa
34080 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75  y, just for robu
34090 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
340a0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72   NEVER(pPager->r
340b0 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  eadOnly) ) retur
340c0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a  n SQLITE_PERM;..
340d0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
340e0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
340f0 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
34100 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69  to be opened. Hi
34110 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69  gher level routi
34120 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  nes have already
34130 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74  .  ** obtained t
34140 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63  he necessary loc
34150 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  ks to begin the 
34160 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
34170 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20  n, but the.  ** 
34180 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
34190 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62   might not yet b
341a0 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20  e open. Open it 
341b0 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74  now if this is t
341c0 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  he case..  **.  
341d0 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  ** This is done 
341e0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73  before calling s
341f0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
34200 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70  Dirty() on the p
34210 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  age. .  ** Other
34220 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65  wise, if it were
34230 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c   done after call
34240 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
34250 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68  eMakeDirty(), th
34260 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  en.  ** an error
34270 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64   might occur and
34280 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64   the pager would
34290 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45   end up in WRITE
342a0 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20  R_LOCKED state. 
342b0 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d   ** with pages m
342c0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69  arked as dirty i
342d0 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a  n the cache..  *
342e0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
342f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
34300 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
34310 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
34320 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
34330 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
34340 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
34350 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
34360 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
34370 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
34380 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
34390 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
343a0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
343b0 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  r) );..  /* Mark
343c0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
343d0 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
343e0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
343f0 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
34400 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
34410 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
34420 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
34430 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
34440 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
34450 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
34460 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
34470 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
34480 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Pg) ){.    asser
34490 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
344a0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c  pPager) );.  }el
344b0 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68  se{.  .    /* Th
344c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
344d0 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
344e0 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
344f0 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
34500 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
34510 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
34520 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
34530 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
34540 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
34550 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
34560 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
34570 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
34580 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
34590 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
345a0 61 6c 28 70 50 67 29 20 26 26 20 21 70 61 67 65  al(pPg) && !page
345b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
345c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
345d0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
345e0 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ger)==0 );.     
345f0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
34600 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
34610 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  ze && isOpen(pPa
34620 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
34630 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
34640 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
34650 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69 36  ata2;.        i6
34660 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  4 iOff = pPager-
34670 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
34680 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
34690 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
346a0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
346b0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
346c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
346d0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
346e0 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
346f0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
34700 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
34710 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
34720 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
34730 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
34740 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
34750 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20  Pager) );..     
34760 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34770 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70  r->journalHdr<=p
34780 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
34790 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  f );.        COD
347a0 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
347b0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
347c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
347d0 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
347e0 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
347f0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
34800 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
34810 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  ..        /* Eve
34820 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69  n if an IO or di
34830 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63  skfull error occ
34840 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61  urs while journa
34850 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  lling the.      
34860 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
34870 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65   block above, se
34880 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20  t the need-sync 
34890 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67  flag for the pag
348a0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  e..        ** Ot
348b0 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68  herwise, when th
348c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
348d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
348e0 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20  e logic in.     
348f0 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f     ** playback_o
34900 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74  ne_page() will t
34910 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61  hink that the pa
34920 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ge needs to be r
34930 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20  estored.        
34940 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
34950 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
34960 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
34970 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
34980 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
34990 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  en corruption ma
349a0 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20  y follow..      
349b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67    */.        pPg
349c0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
349d0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20  _NEED_SYNC;..   
349e0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
349f0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
34a00 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67  d, iOff, pPg->pg
34a10 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
34a20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34a30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34a40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34a50 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
34a60 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
34a70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69  ger->pageSize, i
34a80 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  Off+4);.        
34a90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34aa0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
34ab0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
34ac0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
34ad0 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72  jfd, iOff+pPager
34ae0 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b  ->pageSize+4, ck
34af0 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sum);.        if
34b00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34b10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
34b20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
34b30 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
34b40 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
34b50 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
34b60 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
34b70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
34b80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34b90 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  ));.        PAGE
34ba0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
34bb0 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
34bc0 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  t);.        PAGE
34bd0 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c  RTRACE(("JOURNAL
34be0 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
34bf0 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38  Sync=%d hash(%08
34c00 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
34c10 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
34c20 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
34c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
34c40 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
34c50 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
34c60 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
34c70 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20  (pPg)));..      
34c80 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
34c90 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67  lOff += 8 + pPag
34ca0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
34cb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
34cc0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
34cd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
34ce0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
34cf0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34d00 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
34d10 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
34d20 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
34d30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
34d40 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
34d50 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
34d60 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
34d70 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
34d80 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34d90 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
34da0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
34db0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
34dc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
34dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34de0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
34df0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
34e00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
34e10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
34e20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
34e30 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
34e40 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
34e50 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b  _WRITER_DBMOD ){
34e60 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
34e70 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
34e80 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
34e90 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
34ea0 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
34eb0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
34ec0 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
34ed0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
34ee0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
34ef0 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
34f00 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
34f10 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
34f20 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
34f30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
34f40 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
34f50 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
34f60 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
34f70 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
34f80 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
34f90 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
34fa0 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
34fb0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
34fc0 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
34fd0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
34fe0 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
34ff0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
35000 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
35010 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
35020 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
35030 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
35040 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
35050 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
35060 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
35070 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
35080 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
35090 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
350a0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
350b0 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
350c0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
350d0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
350e0 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
350f0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
35100 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
35110 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
35120 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
35130 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
35140 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
35150 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
35160 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
35170 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
35180 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
35190 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
351a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
351b0 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
351c0 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
351d0 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
351e0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
351f0 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
35200 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
35210 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
35220 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
35230 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
35240 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
35250 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
35260 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
35270 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
35280 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
35290 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
352a0 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
352b0 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
352c0 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
352d0 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
352e0 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
352f0 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
35300 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
35310 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
35320 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
35330 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
35340 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
35350 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
35360 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
35370 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
35380 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
35390 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
353a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
353b0 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
353c0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
353d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
353e0 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
353f0 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
35400 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
35410 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
35420 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
35430 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
35440 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
35450 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
35460 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
35470 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35480 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
35490 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
354a0 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
354b0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
354c0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
354d0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61  r) );..  if( nPa
354e0 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
354f0 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
35500 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
35510 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
35520 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
35530 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
35540 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
35550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
35560 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
35570 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
35580 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
35590 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20  int nPage = 0;  
355a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
355b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
355c0 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
355d0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
355e0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
355f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
35600 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
35610 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
35620 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
35630 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61  e if any page ha
35640 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s PGHDR_NEED_SYN
35650 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74  C */..    /* Set
35660 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70   the doNotSyncSp
35670 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ill flag to 1. T
35680 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
35690 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20  e cannot allow. 
356a0 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20     ** a journal 
356b0 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
356c0 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
356d0 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
356e0 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   by.    ** this 
356f0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  function..    */
35700 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
35710 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MDB );.    asser
35720 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
35730 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  SyncSpill==0 );.
35740 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
35750 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20  tSyncSpill++;.. 
35760 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
35770 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
35780 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
35790 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
357a0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
357b0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
357c0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
357d0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
357e0 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
357f0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
35800 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
35810 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
35820 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
35830 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
35840 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
35850 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
35860 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
35870 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
35880 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
35890 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
358a0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
358b0 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
358c0 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
358d0 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
358e0 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
358f0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
35900 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
35910 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
35920 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
35930 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
35940 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
35950 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
35960 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
35970 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
35980 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70  rt((pg1+nPage)>p
35990 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  Pg->pgno);..    
359a0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
359b0 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
359c0 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
359d0 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
359e0 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20  ii;.      PgHdr 
359f0 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66  *pPage;.      if
35a00 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  ( pg==pPg->pgno 
35a10 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  || !sqlite3Bitve
35a20 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
35a30 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b  nJournal, pg) ){
35a40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
35a50 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
35a60 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
35a70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35a80 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
35a90 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20   pg, &pPage);.  
35aa0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
35ab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35ac0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
35ad0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
35ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
35af0 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
35b00 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
35b10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
35b20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
35b30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35b40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
35b50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
35b60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
35b80 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d  lse if( (pPage =
35b90 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
35ba0 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b  ager, pg))!=0 ){
35bb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
35bc0 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
35bd0 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
35be0 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
35bf0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
35c00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
35c10 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
35c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
35c30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47      /* If the PG
35c40 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
35c50 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
35c60 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
35c70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
35c80 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
35c90 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
35ca0 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
35cb0 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
35cc0 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
35cd0 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
35ce0 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
35cf0 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
35d00 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
35d10 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
35d20 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
35d30 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
35d40 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
35d50 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
35d60 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
35d70 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
35d80 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
35d90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35da0 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63  E_OK && needSync
35db0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
35dc0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
35dd0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
35de0 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
35df0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
35e00 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
35e10 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
35e20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
35e30 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
35e40 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d   pPage->flags |=
35e50 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
35e60 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
35e70 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
35e80 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
35e90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
35ea0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
35eb0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
35ec0 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  l==1 );.    pPag
35ed0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
35ee0 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ll--;.  }else{. 
35ef0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
35f00 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
35f10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
35f20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
35f30 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
35f40 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
35f50 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
35f60 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
35f70 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
35f80 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
35f90 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
35fa0 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
35fb0 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
35fc0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
35fd0 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  page..*/.#ifndef
35fe0 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69   NDEBUG.int sqli
35ff0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36000 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  ble(DbPage *pPg)
36010 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
36020 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
36030 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  Y;.}.#endif../*.
36040 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
36050 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
36060 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
36070 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
36080 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
36090 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
360a0 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20  n page pPg back 
360b0 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
360c0 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
360d0 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
360e0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
360f0 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
36100 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
36110 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73  .** the page has
36120 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61   been added as a
36130 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65   leaf of the fre
36140 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73  elist and so its
36150 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c  .** content no l
36160 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a  onger matters..*
36170 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
36180 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
36190 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
361a0 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
361b0 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
361c0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
361d0 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61  s unused. The pa
361e0 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
361f0 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
36200 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
36210 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
36220 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
36230 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
36240 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
36250 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68  can quadruple th
36260 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
36270 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72   .** DELETE oper
36280 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ations..*/.void 
36290 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
362a0 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  Write(PgHdr *pPg
362b0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
362c0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
362d0 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c  ;.  if( (pPg->fl
362e0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
362f0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76   && pPager->nSav
36300 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  epoint==0 ){.   
36310 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f   PAGERTRACE(("DO
36320 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
36330 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
36340 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
36350 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54  ager)));.    IOT
36360 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
36370 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
36380 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70  Pg->pgno)).    p
36390 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
363a0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 20  DR_DONT_WRITE;. 
363b0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
363c0 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a  ehash(pPg);.  }.
363d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
363e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
363f0 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
36400 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
36410 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20  tabase file .** 
36420 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20  change-counter, 
36430 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79  stored as a 4-by
36440 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
36450 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61  teger starting a
36460 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65  t .** byte offse
36470 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  t 24 of the page
36480 72 20 66 69 6c 65 2e 20 20 54 68 65 20 73 65 63  r file.  The sec
36490 6f 6e 64 61 72 79 20 63 68 61 6e 67 65 20 63 6f  ondary change co
364a0 75 6e 74 65 72 20 61 74 0a 2a 2a 20 39 32 20 69  unter at.** 92 i
364b0 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2c 20  s also updated, 
364c0 61 73 20 69 73 20 74 68 65 20 53 51 4c 69 74 65  as is the SQLite
364d0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
364e0 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a  at offset 96..**
364f0 0a 2a 2a 20 42 75 74 20 74 68 69 73 20 6f 6e 6c  .** But this onl
36500 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
36510 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
36520 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
36530 20 66 61 6c 73 65 2e 0a 2a 2a 20 54 6f 20 61 76   false..** To av
36540 6f 69 64 20 65 78 63 65 73 73 20 63 68 75 72 6e  oid excess churn
36550 69 6e 67 20 6f 66 20 70 61 67 65 20 31 2c 20 74  ing of page 1, t
36560 68 65 20 75 70 64 61 74 65 20 6f 6e 6c 79 20 68  he update only h
36570 61 70 70 65 6e 73 20 6f 6e 63 65 2e 0a 2a 2a 20  appens once..** 
36580 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67  See also the pag
36590 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
365a0 6f 75 6e 74 65 72 28 29 20 72 6f 75 74 69 6e 65  ounter() routine
365b0 20 74 68 61 74 20 64 6f 65 73 20 61 6e 20 0a 2a   that does an .*
365c0 2a 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  * unconditional 
365d0 75 70 64 61 74 65 20 6f 66 20 74 68 65 20 63 68  update of the ch
365e0 61 6e 67 65 20 63 6f 75 6e 74 65 72 73 2e 0a 2a  ange counters..*
365f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69  *.** If the isDi
36600 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73  rectMode flag is
36610 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
36620 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c   is done by call
36630 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
36640 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70  agerWrite() on p
36650 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69  age 1, then modi
36660 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
36670 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  ts of the.** pag
36680 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20  e data. In this 
36690 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77 69  case the file wi
366a0 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77 68  ll be updated wh
366b0 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  en the current.*
366c0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
366d0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
366e0 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f  * The isDirectMo
366f0 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79  de flag may only
36700 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20   be non-zero if 
36710 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  the library was 
36720 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68  compiled.** with
36730 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
36740 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  LE_ATOMIC_WRITE 
36750 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49  macro defined. I
36760 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20  n this case,.** 
36770 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e  if isDirect is n
36780 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
36790 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
367a0 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63  is updated direc
367b0 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e  tly.** by writin
367c0 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72  g an updated ver
367d0 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75  sion of page 1 u
367e0 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74  sing a call to t
367f0 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  he .** sqlite3Os
36800 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e  Write() function
36810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36820 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
36830 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
36840 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
36850 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74  rectMode){.  int
36860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36870 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
36880 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36890 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
368a0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
368b0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
368c0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
368d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
368e0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
368f0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
36900 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e  * Declare and in
36910 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e  itialize constan
36920 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72  t integer 'isDir
36930 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a  ect'. If the.  *
36940 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  * atomic-write o
36950 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65  ptimization is e
36960 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  nabled in this b
36970 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72  uild, then isDir
36980 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74  ect.  ** is init
36990 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
369a0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
369b0 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
369c0 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74  parameter.  ** t
369d0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
369e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69   Otherwise, it i
369f0 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20  s always set to 
36a00 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
36a10 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
36a20 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   if the atomic-w
36a30 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
36a40 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e  n is not.  ** en
36a50 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
36a60 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69   time, the compi
36a70 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65  ler can omit the
36a80 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27   tests of.  ** '
36a90 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c  isDirect' below,
36aa0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
36ab0 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69  block enclosed i
36ac0 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20  n the.  ** "if( 
36ad0 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64  isDirect )" cond
36ae0 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ition..  */.#ifn
36af0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
36b00 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23  E_ATOMIC_WRITE.#
36b10 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d   define DIRECT_M
36b20 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28 20  ODE 0.  assert( 
36b30 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20  isDirectMode==0 
36b40 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
36b50 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f  METER(isDirectMo
36b60 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  de);.#else.# def
36b70 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
36b80 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e  isDirectMode.#en
36b90 64 69 66 0a 0a 20 20 69 66 28 20 21 70 50 61 67  dif..  if( !pPag
36ba0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
36bb0 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64  one && pPager->d
36bc0 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50  bSize>0 ){.    P
36bd0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20  gHdr *pPgHdr;   
36be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36bf0 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  Reference to pag
36c00 65 20 31 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  e 1 */..    asse
36c10 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
36c20 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28  pFile && isOpen(
36c30 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
36c40 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
36c50 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
36c60 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
36c70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36c80 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
36c90 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
36ca0 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d   assert( pPgHdr=
36cb0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
36cc0 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  _OK );..    /* I
36cd0 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66  f page one was f
36ce0 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75  etched successfu
36cf0 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75  lly, and this fu
36d00 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  nction is not.  
36d10 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69    ** operating i
36d20 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d  n direct-mode, m
36d30 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61  ake page 1 writa
36d40 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69  ble.  When not i
36d50 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  n .    ** direct
36d60 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73   mode, page 1 is
36d70 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20   always held in 
36d80 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20  cache and hence 
36d90 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20  the PagerGet(). 
36da0 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61     ** above is a
36db0 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c  lways successful
36dc0 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57   - hence the ALW
36dd0 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54  AYS on rc==SQLIT
36de0 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  E_OK..    */.   
36df0 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44   if( !DIRECT_MOD
36e00 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d  E && ALWAYS(rc==
36e10 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20  SQLITE_OK) ){.  
36e20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36e30 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
36e40 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
36e50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36e60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 74   ){.      /* Act
36e70 75 61 6c 6c 79 20 64 6f 20 74 68 65 20 75 70 64  ually do the upd
36e80 61 74 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  ate of the chang
36e90 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  e counter */.   
36ea0 20 20 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63     pager_write_c
36eb0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 67  hangecounter(pPg
36ec0 48 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Hdr);..      /* 
36ed0 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69  If running in di
36ee0 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65  rect mode, write
36ef0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
36f00 20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20 66   page 1 to the f
36f10 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ile. */.      if
36f20 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b  ( DIRECT_MODE ){
36f30 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76  .        const v
36f40 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20 20  oid *zBuf;.     
36f50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36f60 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20  r->dbFileSize>0 
36f70 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
36f80 32 28 70 50 61 67 65 72 2c 20 70 50 67 48 64 72  2(pPager, pPgHdr
36f90 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c 20 72  ->pData, 1, 6, r
36fa0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  c=SQLITE_NOMEM, 
36fb0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69  zBuf);.        i
36fc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
36fe0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
36ff0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42  e(pPager->fd, zB
37000 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
37010 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
37020 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
37030 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37040 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
37050 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
37060 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ne = 1;.        
37070 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
37080 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
37090 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
370a0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
370b0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
370c0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
370d0 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
370e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
370f0 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  PgHdr);.  }.  re
37100 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37110 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
37120 61 73 65 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ase file to disk
37130 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
37140 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  p for in-memory 
37150 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 6f 72 20  databases.** or 
37160 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20 50  pages with the P
37170 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
37180 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73   set..**.** If s
37190 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66  uccessful, or if
371a0 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
371b0 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20  er for which it 
371c0 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73  is a no-op, this
371d0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
371e0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
371f0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f  Otherwise, an IO
37200 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
37210 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
37220 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
37230 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
37240 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37250 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50  TE_OK;.  if( !pP
37260 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
37270 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
37280 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  DB );.    rc = s
37290 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
372a0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
372b0 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 7d  >syncFlags);.  }
372c0 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28  else if( isOpen(
372d0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
372e0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
372f0 42 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  B );.    sqlite3
37300 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
37310 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
37320 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54  _FCNTL_SYNC_OMIT
37330 54 45 44 2c 20 28 76 6f 69 64 20 2a 29 26 72 63  TED, (void *)&rc
37340 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
37350 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
37360 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f  s function may o
37370 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
37380 69 6c 65 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ile a write-tran
37390 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
373a0 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  e in.** rollback
373b0 2e 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  . If the connect
373c0 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f  ion is in WAL mo
373d0 64 65 2c 20 74 68 69 73 20 63 61 6c 6c 20 69 73  de, this call is
373e0 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74   a no-op. .** Ot
373f0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
37400 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20  connection does 
37410 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 61 76 65  not already have
37420 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
37430 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61  ck on .** the da
37440 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 20  tabase file, an 
37450 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
37460 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a  to obtain one..*
37470 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 43 4c  *.** If the EXCL
37480 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c  USIVE lock is al
37490 72 65 61 64 79 20 68 65 6c 64 20 6f 72 20 74 68  ready held or th
374a0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  e attempt to obt
374b0 61 69 6e 20 69 74 20 69 73 0a 2a 2a 20 73 75 63  ain it is.** suc
374c0 63 65 73 73 66 75 6c 2c 20 6f 72 20 74 68 65 20  cessful, or the 
374d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
374e0 20 57 41 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54   WAL mode, SQLIT
374f0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
37500 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
37510 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 42 55  either SQLITE_BU
37520 53 59 20 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  SY or an SQLITE_
37530 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
37540 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
37550 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
37560 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
37570 76 65 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  veLock(Pager *pP
37580 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
37590 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
375a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
375b0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
375c0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20  TER_CACHEMOD .  
375d0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
375e0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
375f0 49 54 45 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20  ITER_DBMOD .    
37600 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37610 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37620 45 52 5f 4c 4f 43 4b 45 44 20 0a 20 20 29 3b 0a  ER_LOCKED .  );.
37630 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
37640 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
37650 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20 30 3d  ger) );.  if( 0=
37660 3d 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  =pagerUseWal(pPa
37670 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ger) ){.    rc =
37680 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
37690 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
376a0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  USIVE_LOCK);.  }
376b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
376c0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
376d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
376e0 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
376f0 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
37700 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
37710 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
37720 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
37730 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
37740 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
37750 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
37760 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
37770 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
37780 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
37790 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
377a0 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
377b0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
377c0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
377d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
377e0 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ures that:.**.**
377f0 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
37800 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
37810 75 6e 74 65 72 20 69 73 20 75 70 64 61 74 65 64  unter is updated
37820 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75  ,.**   * the jou
37830 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28  rnal is synced (
37840 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69  unless the atomi
37850 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
37860 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a  tion is used),.*
37870 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20  *   * all dirty 
37880 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
37890 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
378a0 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20  e file, .**   * 
378b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
378c0 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 28  e is truncated (
378d0 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e  if required), an
378e0 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  d.**   * the dat
378f0 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
37900 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  d. .**.** The on
37910 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20 72 65  ly thing that re
37920 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
37930 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
37940 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a  is to finalize .
37950 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e  ** (delete, trun
37960 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
37970 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 29 20   first part of) 
37980 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37990 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20   (or .** delete 
379a0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
379b0 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
379c0 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
379d0 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
379e0 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
379f0 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
37a00 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
37a10 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
37a20 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
37a30 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
37a40 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  all..**.** If th
37a50 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
37a60 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20  r - noSync - is 
37a70 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
37a80 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
37a90 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79  elf.** is not sy
37aa0 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  nced. The caller
37ab0 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74   must call sqlit
37ac0 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69  e3PagerSync() di
37ad0 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e  rectly to.** syn
37ae0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
37af0 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
37b00 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  ng CommitPhaseTw
37b10 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68  o() to delete th
37b20 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
37b30 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
37b40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37b50 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
37b60 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
37b70 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
37b80 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
37b90 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
37ba0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20  char *zMaster,  
37bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
37bc0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61  not NULL, the ma
37bd0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
37be0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e  e */.  int noSyn
37bf0 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
37c00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
37c10 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63  o omit the xSync
37c20 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
37c30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
37c40 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
37c50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
37c60 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
37c70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37c80 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37c90 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
37ca0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37cb0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37cc0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
37cd0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37ce0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37cf0 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
37d00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37d10 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
37d20 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
37d30 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
37d40 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  ager) );..  /* I
37d50 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  f a prior error 
37d60 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74  occurred, report
37d70 20 74 68 61 74 20 65 72 72 6f 72 20 61 67 61 69   that error agai
37d80 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  n. */.  if( NEVE
37d90 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
37da0 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
37db0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
37dc0 50 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54  PAGERTRACE(("DAT
37dd0 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
37de0 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
37df0 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  Size=%d\n", .   
37e00 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
37e10 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70  name, zMaster, p
37e20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b  Pager->dbSize));
37e30 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74  ..  /* If no dat
37e40 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 68 61  abase changes ha
37e50 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20 72 65  ve been made, re
37e60 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20  turn early. */. 
37e70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
37e80 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
37e90 5f 43 41 43 48 45 4d 4f 44 20 29 20 72 65 74 75  _CACHEMOD ) retu
37ea0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
37eb0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
37ec0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
37ed0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
37ee0 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
37ef0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
37f00 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a  o, or this.    *
37f10 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
37f20 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
37f30 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79  ed, it is mostly
37f40 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76   a no-op.  Howev
37f50 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62  er, any.    ** b
37f60 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73  ackup in progres
37f70 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
37f80 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  started..    */.
37f90 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
37fa0 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
37fb0 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c  >pBackup);.  }el
37fc0 73 65 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65  se{.    if( page
37fd0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
37fe0 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
37ff0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
38000 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
38010 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
38020 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
38030 61 67 65 4f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ageOne = 0;.    
38040 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
38050 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  {.        /* Mus
38060 74 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20  t have at least 
38070 6f 6e 65 20 70 61 67 65 20 66 6f 72 20 74 68 65  one page for the
38080 20 57 41 4c 20 63 6f 6d 6d 69 74 20 66 6c 61 67   WAL commit flag
38090 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 69 63  ..        ** Tic
380a0 6b 65 74 20 5b 32 64 31 61 35 63 36 37 64 66 63  ket [2d1a5c67dfc
380b0 32 33 36 33 65 34 34 66 32 39 64 39 62 62 64 35  2363e44f29d9bbd5
380c0 37 66 5d 20 32 30 31 31 2d 30 35 2d 31 38 20 2a  7f] 2011-05-18 *
380d0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
380e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
380f0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65  Pager, 1, &pPage
38100 4f 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  One);.        pL
38110 69 73 74 20 3d 20 70 50 61 67 65 4f 6e 65 3b 0a  ist = pPageOne;.
38120 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
38130 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dirty = 0;.     
38140 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
38150 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
38160 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
38170 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
38180 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
38190 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
381a0 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e   pList, pPager->
381b0 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20 20  dbSize, 1, .    
381c0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
381d0 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61 67  >fullSync ? pPag
381e0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3a 20  er->syncFlags : 
381f0 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
38200 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
38210 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
38220 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20 20 20 69  ageOne);.      i
38230 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
38240 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
38250 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
38260 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
38270 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
38280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
38290 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
382a0 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65 20  ock updates the 
382b0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
382c0 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20  Exactly how it. 
382d0 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69       ** does thi
382e0 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  s depends on whe
382f0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
38300 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70  atomic-update op
38310 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  timization.     
38320 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20   ** was enabled 
38330 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
38340 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61   and if this tra
38350 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74  nsaction meets t
38360 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e  he .      ** run
38370 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f  time criteria to
38380 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69   use the operati
38390 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  on: .      **.  
383a0 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20      **    * The 
383b0 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
383c0 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  orts the atomic-
383d0 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66  write property f
383e0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  or.      **     
383f0 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20   blocks of size 
38400 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a  page-size, and .
38410 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68        **    * Th
38420 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74  is commit is not
38430 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
38440 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  -file transactio
38450 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  n, and.      ** 
38460 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65     * Exactly one
38470 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d   page has been m
38480 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72  odified and stor
38490 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
384a0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
384b0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
384c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73  optimization was
384d0 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20   not enabled at 
384e0 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
384f0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
38500 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
38510 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74  ecounter() funct
38520 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
38530 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
38540 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e  ge.      ** coun
38550 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74  ter in 'indirect
38560 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f  -mode'. If the o
38570 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63  ptimization is c
38580 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20  ompiled in but. 
38590 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
385a0 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69  pplicable to thi
385b0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  s transaction, c
385c0 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  all sqlite3Journ
385d0 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 20  alCreate().     
385e0 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65   ** to make sure
385f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
38600 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62  e has actually b
38610 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65  een created, the
38620 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  n call.      ** 
38630 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
38640 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70  ecounter() to up
38650 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
38660 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72  counter in indir
38670 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  ect.      ** mod
38680 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  e. .      **.   
38690 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
386a0 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   if the optimiza
386b0 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61  tion is both ena
386c0 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61  bled and applica
386d0 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ble,.      ** th
386e0 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e  en call pager_in
386f0 63 72 5f 63 68