/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact b0fcbe3038fd08b111e1cf1deddd5f42418004d8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20    u8 syncFlags; 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77  SYNC_FULL otherw
7230: 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ise */.  u8 temp
7240: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
7250: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
7260: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
7270: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
7280: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
7290: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
72a0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
72b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
72c0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72e0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
72f0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
7300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20  **********.  ** 
7350: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7360: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
7370: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7380: 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72   that change dur
7390: 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ing.  ** routine
73a0: 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73   opertion.  Clas
73b0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
73c0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
73d0: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
73e0: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
73f0: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7400: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7410: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7420: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7430: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7440: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7450: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7460: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
7470: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
7480: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
7490: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
74a0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
74b0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
74c0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
74d0: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
74e0: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
74f0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7500: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7510: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7520: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7530: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7550: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7560: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
7570: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
7580: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
75a0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
75b0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
75c0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
75d0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
75e0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
75f0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7600: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7610: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7630: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7640: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7650: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7660: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
7670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7680: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
7690: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
76a0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 64  n-zero */.  u8 d
76b0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20 20  oNotSyncSpill;  
76c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
76d0: 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68 61  t do a spill tha
76e0: 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c 20  t requires jrnl 
76f0: 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75 62  sync */.  u8 sub
7700: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
7710: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7720: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
7730: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
7740: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7760: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7770: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7780: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
7790: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
77b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
77c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
77d0: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
77e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
77f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
7800: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7810: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48  le */.  Pgno dbH
7820: 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  intSize;        
7830: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73      /* Value pas
7840: 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a  sed to FCNTL_SIZ
7850: 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20  E_HINT call */. 
7860: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7880: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
7890: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
78a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
78d0: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
78e0: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
78f0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
7900: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
7910: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
7920: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
7930: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
7940: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
7970: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
7980: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7990: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
79a0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
79b0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
79c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
79d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
79e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
79f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7a00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7a10: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7a20: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7a30: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7a40: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7a50: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7a70: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7a80: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a90: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
7aa0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
7ab0: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
7ac0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7ad0: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
7ae0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7af0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
7b00: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
7b10: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
7b20: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
7b30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
7b40: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
7b50: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
7b60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
7b70: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
7b80: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
7b90: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
7ba0: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
7bb0: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
7bc0: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
7bd0: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bf0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
7c00: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
7c10: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  [] */.  char dbF
7c20: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
7c30: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
7c40: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
7c50: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
7c60: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
7c70: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
7c80: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
7c90: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
7cf0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
7d00: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
7d10: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
7d20: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
7d30: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
7d40: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
7d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7d60: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
7d70: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
7d80: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
7d90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7da0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
7db0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
7dc0: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
7dd0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
7de0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
7df0: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
7e00: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
7e10: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e30: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7e40: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
7e50: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
7e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7e70: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
7e80: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
7e90: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
7ea0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7eb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
7ec0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
7ed0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
7ee0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
7ef0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
7f00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
7f10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7f20: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
7f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7f40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
7f50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7f60: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
7f70: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
7f80: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
7f90: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
7fa0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
7fb0: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
7fc0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
7fd0: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
7fe0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
7ff0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
8000: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
8010: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
8020: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
8030: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
8040: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
8050: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
8060: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
8070: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
8080: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
8090: 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  e*); /* Call thi
80a0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
80b0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
80c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
80d0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
80e0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
80f0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
8100: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
8110: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
8120: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ta */.  void (*x
8130: 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76  CodecSizeChng)(v
8140: 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f  oid*,int,int); /
8150: 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65  * Notify of page
8160: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f   size changes */
8170: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8180: 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20  Free)(void*);   
8190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
81a0: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20  tructor for the 
81b0: 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20  codec */.  void 
81c0: 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20  *pCodec;        
81d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
81e0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
81f0: 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f  ec... methods */
8200: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
8210: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
8220: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
8230: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
8240: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
8250: 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  se */.  PCache *
8260: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
8270: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8280: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
8290: 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ect */.#ifndef S
82a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
82b0: 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20   Wal *pWal;     
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82d0: 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  Write-ahead log 
82e0: 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c  used by "journal
82f0: 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20  _mode=wal" */.  
8300: 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20  char *zWal;     
8310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8320: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69  ile name for wri
8330: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a  te-ahead log */.
8340: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
8350: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
8360: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
8370: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
8380: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
8390: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
83a0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
83b0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
83c0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
83d0: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
83e0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
83f0: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
8400: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8410: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
8420: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
8430: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8440: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8450: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
8460: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
8470: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
8480: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
8490: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
84a0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
84b0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
84c0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
84d0: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
84e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
84f0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
8500: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
8510: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
8520: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8530: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
8540: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
8550: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
8560: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
8570: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
8580: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
8590: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
85a0: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
85b0: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
85c0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
85d0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
85e0: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
85f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
8600: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
8610: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
8620: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8630: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
8640: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
8650: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
8660: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
8670: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
8680: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
8690: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
86a0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
86b0: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
86c0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
86d0: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
86e0: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
86f0: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
8700: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
8710: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
8720: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
8730: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
8740: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
8750: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
8760: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
8770: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8780: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
8790: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
87a0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
87b0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
87c0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
87d0: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
87e0: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
87f0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
8800: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
8810: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
8820: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
8830: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
8840: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
8850: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
8860: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
8870: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
8880: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
8890: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
88a0: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
88b0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
88c0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
88d0: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
88e0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
88f0: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
8900: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
8910: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
8920: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
8930: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
8940: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
8950: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
8960: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
8970: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
8980: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
8990: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
89a0: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
89b0: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
89c0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
89d0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
89e0: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
89f0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
8a00: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
8a10: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
8a20: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
8a30: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
8a40: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
8a50: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
8a60: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
8a70: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
8a80: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
8a90: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
8aa0: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
8ab0: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
8ac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
8ad0: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
8ae0: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
8af0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
8b00: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
8b10: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
8b20: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8b30: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
8b40: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
8b50: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
8b60: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
8b70: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
8b80: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
8b90: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
8ba0: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
8bb0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
8bc0: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
8bd0: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
8be0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
8bf0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
8c00: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
8c10: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
8c20: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
8c30: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
8c40: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
8c50: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
8c60: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
8c70: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
8c80: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
8c90: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
8ca0: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
8cb0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
8cc0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
8cd0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
8ce0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
8cf0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
8d00: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
8d10: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
8d20: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
8d30: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
8d40: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
8d50: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
8d60: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
8d70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
8d80: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
8d90: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
8da0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
8db0: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
8dc0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
8dd0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
8de0: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
8df0: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
8e00: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
8e10: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
8e20: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
8e30: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
8e40: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
8e50: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
8e60: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
8e70: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
8e80: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
8e90: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
8ea0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
8eb0: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
8ec0: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
8ed0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
8ee0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
8ef0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
8f00: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
8f10: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
8f20: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
8f30: 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65 73   this pager uses
8f40: 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c   a write-ahead l
8f50: 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  og instead of th
8f60: 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62  e usual.** rollb
8f70: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68  ack journal. Oth
8f80: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
8f90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8fa0: 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63 20  OMIT_WAL.static 
8fb0: 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c 28  int pagerUseWal(
8fc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8fd0: 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
8fe0: 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65  ->pWal!=0);.}.#e
8ff0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
9000: 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23 20  erUseWal(x) 0.# 
9010: 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c  define pagerRoll
9020: 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20 64  backWal(x) 0.# d
9030: 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46 72  efine pagerWalFr
9040: 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29 20  ames(v,w,x,y,z) 
9050: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9060: 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
9070: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (z) SQLITE_OK.# 
9080: 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69  define pagerBegi
9090: 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
90a0: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (z) SQLITE_OK.#e
90b0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
90c0: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67  EBUG ./*.** Usag
90d0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  e:.**.**   asser
90e0: 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
90f0: 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
9100: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9110: 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61  tion runs many a
9120: 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f  sserts to try to
9130: 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65   find inconsiste
9140: 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ncies in.** the 
9150: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
9160: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
9170: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
9180: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
9190: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
91a0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
91b0: 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65  = p;..  /* State
91c0: 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20   must be valid. 
91d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
91e0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
91f0: 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  EN.       || p->
9200: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
9210: 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70  ADER.       || p
9220: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9230: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
9240: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9250: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9260: 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
9270: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9280: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9290: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
92a0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
92b0: 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20  ER_FINISHED.    
92c0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
92d0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29  =PAGER_ERROR.  )
92e0: 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65  ;..  /* Regardle
92f0: 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ss of the curren
9300: 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d  t state, a temp-
9310: 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  file connection 
9320: 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20  always behaves. 
9330: 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73   ** as if it has
9340: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
9350: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
9360: 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65  se file. It neve
9370: 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74  r updates.  ** t
9380: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
9390: 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20  r field, so the 
93a0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
93b0: 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73  flag is always s
93c0: 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
93d0: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
93e0: 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  0 || p->eLock==E
93f0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
9400: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
9410: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
9420: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9430: 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Done );..  /* If
9440: 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20   the useJournal 
9450: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  flag is clear, t
9460: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9470: 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a  must be "OFF". .
9480: 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
9490: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
94a0: 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e  "OFF", the journ
94b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74  al file must not
94c0: 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   be open..  */. 
94d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
94e0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
94f0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9500: 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  | p->useJournal 
9510: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9520: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
9530: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9540: 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d  FF || !isOpen(p-
9550: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9560: 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20  heck that MEMDB 
9570: 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20  implies noSync. 
9580: 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  And an in-memory
9590: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
95a0: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73  .  ** this means
95b0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
95c0: 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20  ger performs no 
95d0: 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61  IO at all, it ca
95e0: 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a  nnot encounter .
95f0: 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49    ** either SQLI
9600: 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
9610: 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72  TE_FULL during r
9620: 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65  ollback or while
9630: 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a   finalizing .  *
9640: 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * a journal file
9650: 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20  . (although the 
9660: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9670: 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  l implementation
9680: 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72   may .  ** retur
9690: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
96a0: 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a  OMEM while the j
96b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
96c0: 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49  eing written). I
96d0: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65  t .  ** is there
96e0: 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c  fore not possibl
96f0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
9700: 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  ry pager to ente
9710: 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a  r the ERROR .  *
9720: 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  * state..  */.  
9730: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
9740: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
9750: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
9760: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9770: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9780: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
9790: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
97a0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
97b0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
97c0: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
97d0: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
97e0: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
97f0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
9800: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9810: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
9820: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
9830: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
9840: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
9850: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
9860: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
9870: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
9880: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9890: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
98a0: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
98b0: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
98c0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
98d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
98e0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
98f0: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
9900: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
9910: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
9920: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
9930: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
9940: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9950: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9960: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9970: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
9980: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
9990: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
99a0: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
99b0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
99c0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
99d0: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
99e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
99f0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9a00: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9a10: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9a20: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9a30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9a40: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
9a50: 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64 6c  CK || p->noReadl
9a60: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ock );.      bre
9a70: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9a80: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9a90: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9aa0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9ab0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9ac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ad0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9ae0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9af0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9b00: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9b10: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9b20: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9b30: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9b40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9b50: 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72  ->dbSize==pPager
9b60: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
9b70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9b80: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9b90: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ==pPager->dbFile
9ba0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
9bb0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9bc0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9bd0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
9be0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9bf0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
9c00: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
9c10: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9c20: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
9c30: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
9c40: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9c50: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9c60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9c70: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9c80: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9c90: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9ca0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9cb0: 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
9cc0: 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72  ble that if jour
9cd0: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72  nal_mode=wal her
9ce0: 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74  e that neither t
9cf0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
9d00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74  urnal file nor t
9d10: 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20  he WAL file are 
9d20: 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65  open. This happe
9d30: 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20  ns during.      
9d40: 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
9d50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
9d60: 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a   switches from j
9d70: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a  ournal_mode=off.
9d80: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f          ** to jo
9d90: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a  urnal_mode=wal..
9da0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9db0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9dc0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9dd0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  CK );.        as
9de0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
9df0: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
9e00: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9e10: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9e20: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9e30: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
9e40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9e50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
9e60: 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  AL .        );. 
9e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9e80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9e90: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9ea0: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9eb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9ec0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9ed0: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
9ee0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ize );.      bre
9ef0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9f00: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9f10: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9f20: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9f30: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
9f40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9f50: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9f60: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9f70: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
9f80: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
9f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9fa0: 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f  Lock>=EXCLUSIVE_
9fb0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9fc0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
9fd0: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
9fe0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9ff0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a000: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
a010: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a020: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a030: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
a040: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
a050: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a060: 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65  bOrigSize<=pPage
a070: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a080: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a090: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a0a0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20  ITER_FINISHED:. 
a0b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a0c0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
a0d0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a0e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a0f0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a100: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a110: 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
a120: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
a130: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a140: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a150: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a160: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a170: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a180: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a190: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a1a0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a1b0: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a1c0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a1d0: 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a  se PAGER_ERROR:.
a1e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d        /* There m
a1f0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
a200: 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
a210: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
a220: 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20   pager if.      
a230: 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  ** in ERROR stat
a240: 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  e. Otherwise the
a250: 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61   pager should ha
a260: 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70  ve already dropp
a270: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
a280: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a   to OPEN state..
a290: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
a2a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a2b0: 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
a2c0: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a2d0: 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
a2e0: 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
a2f0: 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20  >pPCache)>0 );. 
a300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
a310: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
a320: 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
a330: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
a340: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a  f SQLITE_DEBUG .
a350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
a360: 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61  ointer to a huma
a370: 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e  n readable strin
a380: 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75  g in a static bu
a390: 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
a3a0: 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ng the state of 
a3b0: 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
a3c0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
a3d0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20  gument. This.** 
a3e0: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
a3f0: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65  e used within de
a400: 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61  buggers. For exa
a410: 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65  mple, as an alte
a420: 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70  rnative.** to "p
a430: 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e  rint *pPager" in
a440: 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62   gdb:.**.** (gdb
a450: 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70  ) printf "%s", p
a460: 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65  rint_pager_state
a470: 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74  (pPager).*/.stat
a480: 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70  ic char *print_p
a490: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
a4a0: 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *p){.  static c
a4b0: 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a  har zRet[1024];.
a4c0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
a4d0: 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a  ntf(1024, zRet,.
a4e0: 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a        "Filename:
a4f0: 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20        %s\n".    
a500: 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20    "State:       
a510: 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c    %s errCode=%d\
a520: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20  n".      "Lock: 
a530: 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20           %s\n". 
a540: 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f       "Locking mo
a550: 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  de:  locking_mod
a560: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a  e=%s\n".      "J
a570: 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f  ournal mode:  jo
a580: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22  urnal_mode=%s\n"
a590: 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20  .      "Backing 
a5a0: 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d  store: tempFile=
a5b0: 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a  %d memDb=%d useJ
a5c0: 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20  ournal=%d\n".   
a5d0: 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20     "Journal:    
a5e0: 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c     journalOff=%l
a5f0: 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c  ld journalHdr=%l
a600: 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a  ld\n".      "Siz
a610: 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69  e:          dbsi
a620: 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65  ze=%d dbOrigSize
a630: 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25  =%d dbFileSize=%
a640: 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  d\n".      , p->
a650: 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20  zFilename.      
a660: 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  , p->eState==PAG
a670: 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20  ER_OPEN         
a680: 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20     ? "OPEN" :.  
a690: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a6a0: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20  =PAGER_READER   
a6b0: 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52         ? "READER
a6c0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a6d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
a6e0: 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22  TER_LOCKED   ? "
a6f0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a  WRITER_LOCKED" :
a700: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a710: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a720: 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49  _CACHEMOD ? "WRI
a730: 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a  TER_CACHEMOD" :.
a740: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a750: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
a760: 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54  DBMOD    ? "WRIT
a770: 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20  ER_DBMOD" :.    
a780: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a790: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
a7a0: 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46  SHED ? "WRITER_F
a7b0: 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20  INISHED" :.     
a7c0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7d0: 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20  GER_ERROR       
a7e0: 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20      ? "ERROR" : 
a7f0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
a800: 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64  , (int)p->errCod
a810: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f  e.      , p->eLo
a820: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  ck==NO_LOCK     
a830: 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20      ? "NO_LOCK" 
a840: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
a850: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
a860: 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22  K   ? "RESERVED"
a870: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a880: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a890: 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56  OCK  ? "EXCLUSIV
a8a0: 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  E" :.        p->
a8b0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
a8c0: 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44  CK     ? "SHARED
a8d0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a8e0: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
a8f0: 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e  CK    ? "UNKNOWN
a900: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
a910: 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69      , p->exclusi
a920: 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73  veMode ? "exclus
a930: 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a  ive" : "normal".
a940: 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e        , p->journ
a950: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a960: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
a970: 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a     ? "memory" :.
a980: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
a990: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a9a0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
a9b0: 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20     ? "off" :.   
a9c0: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
a9d0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a9e0: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
a9f0: 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20  ? "delete" :.   
aa00: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
aa10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
aa20: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
aa30: 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20  ? "persist" :.  
aa40: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
aa50: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
aa60: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
aa70: 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a   ? "truncate" :.
aa80: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
aa90: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aaa0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
aab0: 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65     ? "wal" : "?e
aac0: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28  rror?".      , (
aad0: 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c  int)p->tempFile,
aae0: 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20   (int)p->memDb, 
aaf0: 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e  (int)p->useJourn
ab00: 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  al.      , p->jo
ab10: 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75  urnalOff, p->jou
ab20: 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20  rnalHdr.      , 
ab30: 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20  (int)p->dbSize, 
ab40: 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69  (int)p->dbOrigSi
ab50: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69  ze, (int)p->dbFi
ab60: 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72  leSize.  );..  r
ab70: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
ab80: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
ab90: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
aba0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
abb0: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
abc0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
abd0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
abe0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
abf0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
ac00: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
ac10: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
ac20: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
ac30: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
ac40: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
ac50: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
ac60: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
ac70: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
ac80: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
ac90: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
aca0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
acb0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
acc0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
acd0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
ace0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
acf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
ad00: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
ad10: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67  gHdr *pPg){.  Pg
ad20: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
ad30: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
ad40: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
ad50: 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  er;.  int i;.  f
ad60: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72  or(i=0; i<pPager
ad70: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b  ->nSavepoint; i+
ad80: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
ad90: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
ada0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
adb0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  i];.    if( p->n
adc0: 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d  Orig>=pgno && 0=
add0: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  =sqlite3BitvecTe
ade0: 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  st(p->pInSavepoi
adf0: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
ae00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
ae10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ae20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
ae30: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
ae40: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
ae50: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
ae60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
ae70: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
ae80: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
ae90: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
aea0: 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61  vecTest(pPg->pPa
aeb0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
aec0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a   pPg->pgno);.}..
aed0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
aee0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
aef0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
af00: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
af10: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
af20: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
af30: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
af40: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
af50: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
af60: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
af70: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
af80: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
af90: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
afa0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
afb0: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
afc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
afd0: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
afe0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
aff0: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
b000: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
b010: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
b020: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
b030: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
b040: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
b050: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b060: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
b070: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
b080: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
b090: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b0a0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
b0b0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
b0c0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
b0d0: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
b0e0: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
b0f0: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
b100: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
b110: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a  yte((u8*)A,B)...
b120: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b130: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b140: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
b150: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
b160: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
b170: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
b180: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
b190: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b1a0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
b1b0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
b1c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b1d0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b1e0: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
b1f0: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
b200: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
b210: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
b220: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
b230: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
b240: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
b250: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
b260: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
b270: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
b280: 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48  NO_LOCK.** or SH
b290: 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72  ARED_LOCK. Regar
b2a0: 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
b2b0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c   or not the call
b2c0: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
b2d0: 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74   succeeds, set t
b2e0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
b2f0: 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68  ariable to match
b300: 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29   the (attempted)
b310: 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   new lock..**.**
b320: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
b330: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
b340: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
b350: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
b360: 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20  n is.** called, 
b370: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
b380: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
b390: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
b3a0: 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f  ine of .** UNKNO
b3b0: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
b3c0: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
b3d0: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
b3e0: 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  t pagerUnlockDb(
b3f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b400: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
b410: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b420: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
b430: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
b440: 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  de || pPager->eL
b450: 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock==eLock );.  
b460: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e  assert( eLock==N
b470: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  O_LOCK || eLock=
b480: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b490: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21    assert( eLock!
b4a0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65  =NO_LOCK || page
b4b0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
b4c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
b4d0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
b4e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
b4f0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  ager->eLock>=eLo
b500: 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ck );.    rc = s
b510: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
b520: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
b530: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
b540: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
b550: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
b560: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
b570: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
b580: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b590: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
b5a0: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
b5b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b5c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
b5d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b5e0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
b5f0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
b600: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
b610: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
b620: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
b630: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
b640: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
b650: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
b660: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
b670: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
b680: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
b690: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b6a0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b6b0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b6c0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
b6d0: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
b6e0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
b6f0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
b700: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
b710: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
b720: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
b730: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
b740: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
b750: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
b760: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
b770: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
b780: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
b790: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
b7a0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
b7b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b7c0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
b7d0: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
b7e0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
b7f0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
b800: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
b810: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
b820: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
b830: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
b840: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
b850: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
b860: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
b870: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
b880: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b890: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
b8a0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
b8b0: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
b8c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
b8d0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b8e0: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b8f0: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
b900: 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
b910: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
b920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b930: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b940: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
b950: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
b960: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
b970: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
b980: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
b990: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
b9a0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
b9b0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
b9c0: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
b9d0: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
b9e0: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
b9f0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
ba00: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
ba10: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
ba20: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
ba30: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
ba40: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
ba50: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
ba60: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
ba70: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
ba80: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
ba90: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
baa0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  size..**.** The 
bab0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
bac0: 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62  also always enab
bad0: 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  led for temporar
bae0: 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a  y files. It is.*
baf0: 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61  * an error to ca
bb00: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
bb10: 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70   if pPager is op
bb20: 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  ened on an in-me
bb30: 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
bb40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
bb50: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
bb60: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
bb70: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
bb80: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
bb90: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
bba0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
bbb0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
bbc0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
bbd0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
bbe0: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
bbf0: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
bc00: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
bc10: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
bc20: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
bc30: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
bc40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bc50: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
bc60: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
bc70: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
bc80: 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20     int dc;      
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
bcb0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
bcc0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f  /.    int nSecto
bcd0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
bce0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
bcf0: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e  r size */.    in
bd00: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
bd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
bd40: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
bd50: 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  );.    dc = sqli
bd60: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
bd70: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
bd80: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63  r->fd);.    nSec
bd90: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
bda0: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a  ctorSize;.    sz
bdb0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
bdc0: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
bdd0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
bde0: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
bdf0: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
be00: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
be10: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
be20: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
be30: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
be40: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
be50: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
be60: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
be70: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
be80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
be90: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
bea0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
beb0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
bec0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
bed0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
bee0: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
bef0: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
bf00: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
bf10: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
bf20: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
bf30: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
bf40: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
bf50: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
bf60: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
bf70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
bf80: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
bf90: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
bfa0: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
bfb0: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
bfc0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
bfd0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
bfe0: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
bff0: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
c000: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
c010: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
c020: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
c030: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
c040: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
c050: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
c060: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
c070: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
c080: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c090: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
c0a0: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
c0b0: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
c0c0: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
c0d0: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
c0e0: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
c0f0: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
c100: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c110: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
c120: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
c130: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
c140: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
c150: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
c160: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
c170: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
c180: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c190: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
c1a0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
c1b0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
c1c0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
c1d0: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
c1e0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
c1f0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
c200: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
c210: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
c220: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
c230: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
c240: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
c250: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
c260: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
c270: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
c280: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
c290: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
c2a0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
c2b0: 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
c2c0: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
c2d0: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
c2e0: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
c2f0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
c300: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
c310: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
c320: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
c330: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
c340: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  (X)  0.#define p
c350: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c360: 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45  h(X).#define CHE
c370: 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69  CK_PAGE(x).#endi
c380: 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45  f  /* SQLITE_CHE
c390: 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a  CK_PAGES */../*.
c3a0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
c3b0: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
c3c0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
c3d0: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
c3e0: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66   open..** This f
c3f0: 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
c400: 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65   to read a maste
c410: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
c420: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ame from the .**
c430: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
c440: 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73   and, if success
c450: 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69  ful, copies it i
c460: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
c470: 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63  ied .** by the c
c480: 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65  aller. See comme
c490: 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d  nts above writeM
c4a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
c4b0: 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a  or the format.**
c4c0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
c4d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c4e0: 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65  file name at the
c4f0: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
c500: 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d  l file..**.** zM
c510: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
c520: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
c530: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
c540: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
c550: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
c560: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
c570: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
c580: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
c590: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
c5a0: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
c5b0: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
c5c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
c5d0: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
c5e0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
c5f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
c600: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
c610: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
c620: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
c630: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
c640: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
c650: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
c660: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
c670: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
c680: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
c690: 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72  *.** If a master
c6a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c6b0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74  me is present at
c6c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c6d0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c  journal.** file,
c6e0: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69   then it is copi
c6f0: 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  ed into the buff
c700: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
c710: 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e   zMaster. A.** n
c720: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
c730: 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  te is appended t
c740: 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c  o the buffer fol
c750: 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65  lowing the maste
c760: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r.** journal fil
c770: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e name..**.** If
c780: 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65   it is determine
c790: 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72  d that no master
c7a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c7b0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a  me is present .*
c7c0: 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20  * zMaster[0] is 
c7d0: 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
c7e0: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
c7f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
c800: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
c810: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
c820: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61   journal file, a
c830: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f  n SQLite.** erro
c840: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
c850: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
c860: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
c870: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  nal(sqlite3_file
c880: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a   *pJrnl, char *z
c890: 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73  Master, u32 nMas
c8a0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
c8d0: 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20  e */.  u32 len; 
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62    /* Length in b
c900: 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ytes of master j
c910: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
c920: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
c930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c940: 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74  otal size in byt
c950: 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  es of journal fi
c960: 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33  le pJrnl */.  u3
c970: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
c980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63           /* MJ c
c990: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65  hecksum value re
c9a0: 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ad from journal 
c9b0: 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
c9e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e   counter */.  un
c9f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
ca00: 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75  ic[8];   /* A bu
ca10: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
ca20: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
ca30: 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20  .  zMaster[0] = 
ca40: 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c  '\0';..  if( SQL
ca50: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
ca60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
ca70: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20  pJrnl, &szJ)).  
ca80: 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c   || szJ<16.   ||
ca90: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
caa0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
cab0: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
cac0: 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d  )).   || len>=nM
cad0: 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c  aster .   || SQL
cae0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
caf0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
cb00: 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29  szJ-12, &cksum))
cb10: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
cb20: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
cb30: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
cb40: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a  gic, 8, szJ-8)).
cb50: 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61     || memcmp(aMa
cb60: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
cb70: 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c  ic, 8).   || SQL
cb80: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
cb90: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
cba0: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
cbb0: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20   szJ-16-len)).  
cbc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
cbd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
cbe0: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
cbf0: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
cc00: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
cc10: 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  */.  for(u=0; u<
cc20: 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63  len; u++){.    c
cc30: 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b  ksum -= zMaster[
cc40: 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  u];.  }.  if( ck
cc50: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
cc60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
cc70: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
cc80: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
cc90: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
cca0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
ccb0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
ccc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
ccd0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
cce0: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
ccf0: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
cd00: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
cd10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
cd20: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
cd30: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
cd40: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
cd50: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65  e..    */.    le
cd60: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61  n = 0;.  }.  zMa
cd70: 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ster[len] = '\0'
cd80: 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  ;.   .  return S
cd90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cda0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  ** Return the of
cdb0: 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74  fset of the sect
cdc0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f  or boundary at o
cdd0: 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  r immediately .*
cde0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
cdf0: 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d  value in pPager-
ce00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73  >journalOff, ass
ce10: 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a  uming a sector .
ce20: 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65  ** size of pPage
ce30: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79  r->sectorSize by
ce40: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  tes..**.** i.e f
ce50: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
ce60: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20   of 512:.**.**  
ce70: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
ce80: 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  f          Retur
ce90: 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d  n value.**   ---
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20      0.**   512  
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30       512.**   10
cf10: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
cf20: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
cf30: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
cf40: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
cf50: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ** .*/.static i6
cf60: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  4 journalHdrOffs
cf70: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
cf80: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
cf90: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
cfa0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cfb0: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
cfc0: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
cfd0: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
cfe0: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
cff0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d000: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
d010: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
d020: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d030: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
d040: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
d050: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
d060: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
d070: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
d080: 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b    return offset;
d090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
d0a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
d0b0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
d0c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d0d0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
d0e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
d0f0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72  o-op if the jour
d100: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  nal file has not
d110: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
d120: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63  .** within the c
d130: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
d140: 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65  on (i.e. if Page
d150: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29  r.journalOff==0)
d160: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75  ..**.** If doTru
d170: 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  ncate is non-zer
d180: 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a  o or the Pager.j
d190: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d1a0: 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73  variable is.** s
d1b0: 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72  et to 0, then tr
d1c0: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
d1d0: 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  al file to zero 
d1e0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f  bytes in size. O
d1f0: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72  therwise,.** zer
d200: 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65  o the 28-byte he
d210: 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72  ader at the star
d220: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
d230: 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72   file. In either
d240: 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68   case, .** if th
d250: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
d260: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
d270: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
d280: 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c   file immediatel
d290: 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74  y .** after writ
d2a0: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
d2b0: 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  g it..**.** If P
d2c0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
d2d0: 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20  Limit is set to 
d2e0: 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d  a positive, non-
d2f0: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a  zero value, and.
d300: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d310: 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a   truncation or z
d320: 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64  eroing described
d330: 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20   above the size 
d340: 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e  of the .** journ
d350: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
d360: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
d370: 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e  this value, then
d380: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
d390: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d3a0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
d3b0: 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54  zeLimit bytes. T
d3c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d3d0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64  does.** not need
d3e0: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f   to be synced fo
d3f0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
d400: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ration..**.** If
d410: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
d420: 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f  urs, abandon pro
d430: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
d440: 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  rn the IO error 
d450: 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  code..** Otherwi
d460: 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  se, return SQLIT
d470: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
d480: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
d490: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
d4a0: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
d4b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
d4c0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
d4f0: 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
d500: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
d510: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
d520: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d530: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
d540: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
d550: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
d560: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
d570: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
d580: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
d590: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
d5a0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
d5b0: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
d5c0: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
d5d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d5e0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
d5f0: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
d600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
d610: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
d620: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
d630: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d640: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
d650: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
d660: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
d670: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
d680: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d690: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
d6a0: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
d6b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
d6c0: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
d6d0: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
d6e0: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
d6f0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  Flags);.    }.. 
d700: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
d710: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
d720: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
d730: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
d740: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
d750: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
d760: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
d770: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
d780: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
d790: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
d7a0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
d7b0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
d7c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
d7d0: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
d7e0: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
d7f0: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
d800: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
d810: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
d820: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
d830: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
d840: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
d850: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
d860: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d870: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
d880: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
d890: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d8a0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
d8b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
d8c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
d8d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
d8e0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
d8f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d900: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
d910: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
d920: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d930: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d940: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
d950: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
d960: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
d970: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d980: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
d990: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
d9a0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
d9b0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
d9c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
d9d0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
d9e0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
d9f0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
da00: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
da10: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
da20: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
da30: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
da40: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
da50: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
da60: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
da70: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
da80: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
da90: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
daa0: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
dab0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
dac0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
dad0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
dae0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
daf0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
db00: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
db10: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
db20: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
db30: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
db40: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
db50: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
db60: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
db70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
db80: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
db90: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
dba0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
dbb0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
dbc0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
dbd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbf0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
dc00: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
dc10: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
dc20: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
dc30: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
dc40: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
dc50: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
dc60: 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  = (u32)pPager->p
dc70: 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20  ageSize;/* Size 
dc80: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
dc90: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
dca0: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
dcd0: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
dce0: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
dcf0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
dd20: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
dd30: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
dd40: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
dd50: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
dd60: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
dd70: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
dd80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
dd90: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
dda0: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
ddb0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
ddc0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
ddd0: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
dde0: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
ddf0: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
de00: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
de10: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
de20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
de30: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
de40: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
de50: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
de60: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
de70: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
de80: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
de90: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
dea0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
deb0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
dec0: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
ded0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
dee0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
def0: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
df00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
df10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
df20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
df30: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
df40: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
df50: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
df60: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
df70: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
df80: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
df90: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
dfa0: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
dfb0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
dfc0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
dfd0: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
dfe0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
dff0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
e000: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
e010: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
e020: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
e030: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
e040: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
e050: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
e060: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
e070: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
e080: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
e090: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
e0a0: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
e0b0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
e0c0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
e0d0: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
e0e0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
e0f0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
e100: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
e110: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
e120: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
e130: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
e140: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
e150: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e160: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
e170: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
e180: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
e190: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
e1a0: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
e1b0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
e1c0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
e1d0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
e1e0: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
e1f0: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
e200: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
e210: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
e220: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
e230: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
e240: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
e250: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
e260: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
e270: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
e280: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
e290: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
e2a0: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
e2b0: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
e2c0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
e2d0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e2e0: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
e2f0: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
e300: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
e310: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
e320: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
e330: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
e340: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
e350: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
e360: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
e370: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
e380: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
e390: 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  nc || (pPager->j
e3a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
e3b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
e3c0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
e3d0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
e3e0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
e3f0: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
e400: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
e410: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
e420: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
e430: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
e440: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e450: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
e460: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e470: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
e480: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
e490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
e4a0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
e4b0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e4c0: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
e4d0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
e4e0: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
e4f0: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
e500: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
e510: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
e520: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
e530: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
e540: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e550: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e560: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
e570: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e580: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
e590: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
e5a0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e5b0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e5c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
e5d0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
e5e0: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
e5f0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
e600: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
e610: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
e620: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e630: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e640: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
e650: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
e660: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
e670: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
e680: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e690: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
e6a0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
e6b0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
e6c0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
e6d0: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
e6e0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
e6f0: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
e700: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
e710: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e720: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
e730: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
e740: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
e750: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
e760: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
e770: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
e780: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
e790: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
e7a0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
e7b0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
e7c0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e7d0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
e7e0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
e7f0: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
e800: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
e810: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
e820: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
e830: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
e840: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
e850: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
e860: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
e870: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
e880: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
e890: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
e8a0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
e8b0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
e8c0: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
e8d0: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
e8e0: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
e8f0: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
e900: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
e910: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
e920: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
e930: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
e940: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
e950: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
e960: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
e970: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
e980: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
e990: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
e9a0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
e9b0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
e9c0: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
e9d0: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
e9e0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
e9f0: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
ea00: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
ea10: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
ea20: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
ea30: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
ea40: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
ea50: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
ea60: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
ea70: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
ea80: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
ea90: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
eaa0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
eab0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
eac0: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
ead0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
eae0: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
eaf0: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
eb00: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
eb10: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
eb20: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
eb30: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
eb40: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
eb50: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
eb60: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
eb70: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
eb80: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
eb90: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
eba0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
ebb0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
ebc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
ebd0: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
ebe0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
ebf0: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
ec00: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
ec10: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
ec20: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
ec30: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
ec40: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
ec50: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
ec60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
ec70: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
ec80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ec90: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
eca0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ecb0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
ecc0: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
ecd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ece0: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
ecf0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
ed00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
ed10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
ed20: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
ed30: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
ed40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
ed50: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
ed60: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
ed70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
ed80: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
ed90: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
eda0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
edb0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
edc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
edd0: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
ede0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
edf0: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
ee00: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
ee10: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
ee20: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
ee30: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
ee40: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
ee50: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
ee60: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
ee70: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
ee80: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
ee90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
eea0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
eeb0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
eec0: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
eed0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
eee0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
eef0: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
ef00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
ef10: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
ef20: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
ef30: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
ef40: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
ef50: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
ef60: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
ef70: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
ef80: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
ef90: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
efa0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
efb0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
efc0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
efd0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
efe0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
eff0: 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
f000: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
f010: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
f020: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
f030: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
f040: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f050: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
f060: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
f070: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
f080: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
f090: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
f0a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
f0b0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
f0c0: 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
f0d0: 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
f0e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f0f0: 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
f100: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
f110: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
f120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f130: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f140: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
f150: 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
f160: 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
f170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f180: 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
f190: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
f1a0: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
f1b0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f1d0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
f1e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
f1f0: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
f200: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
f210: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
f220: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
f230: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
f240: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
f250: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
f260: 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
f270: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
f280: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
f290: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
f2a0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
f2b0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
f2c0: 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
f2d0: 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
f2e0: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
f2f0: 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
f300: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
f310: 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
f320: 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
f330: 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
f340: 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
f350: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
f360: 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
f370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f380: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
f390: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
f3a0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
f3b0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
f3c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
f3d0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
f3e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f3f0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
f400: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
f410: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
f420: 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
f430: 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
f440: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
f450: 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
f460: 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
f470: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
f480: 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
f490: 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
f4a0: 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
f4b0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
f4c0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
f4d0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
f4e0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
f4f0: 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
f500: 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
f510: 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
f520: 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
f530: 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
f540: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
f550: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
f560: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
f570: 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
f580: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f590: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f5a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
f5b0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
f5c0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
f5d0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
f5e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f5f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
f600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
f610: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
f620: 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
f630: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f640: 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
f650: 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
f660: 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
f670: 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
f680: 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
f690: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
f6a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
f6b0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f6c0: 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
f6d0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
f6e0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
f6f0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
f700: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
f710: 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
f720: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
f730: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f740: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f750: 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
f760: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
f770: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
f780: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f790: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f7a0: 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
f7b0: 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
f7c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
f7d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
f7e0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
f7f0: 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
f800: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
f810: 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
f820: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
f830: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
f840: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
f850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
f860: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
f870: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
f880: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
f890: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
f8a0: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
f8b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f8c0: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
f8d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f8e0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f8f0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f900: 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
f910: 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
f920: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
f930: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
f940: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
f950: 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
f960: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
f970: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
f980: 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66    /* Versions of
f990: 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
f9a0: 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70   3.5.8 set the p
f9b0: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
f9c0: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  f the.    ** jou
f9d0: 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a  rnal header to z
f9e0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
f9f0: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
fa00: 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  he Pager.pageSiz
fa10: 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  e.    ** variabl
fa20: 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  e is already set
fa30: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
fa40: 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  page size..    *
fa50: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fa60: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
fa70: 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  iPageSize = pPag
fa80: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
fa90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
faa0: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
fab0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
fac0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fad0: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
fae0: 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
faf0: 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
fb00: 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
fb10: 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
fb20: 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
fb30: 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
fb40: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
fb50: 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
fb60: 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
fb70: 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
fb80: 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
fb90: 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
fba0: 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
fbb0: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
fbc0: 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
fbd0: 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
fbe0: 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
fbf0: 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
fc00: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
fc10: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
fc20: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
fc30: 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
fc40: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
fc50: 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
fc60: 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
fc70: 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
fc80: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
fc90: 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
fca0: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
fcb0: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
fcc0: 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
fcd0: 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
fce0: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
fcf0: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
fd00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
fd10: 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
fd20: 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
fd30: 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
fd40: 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
fd50: 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
fd60: 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
fd70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
fd80: 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
fd90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fda0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
fdb0: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
fdc0: 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
fdd0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
fde0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
fdf0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
fe00: 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
fe10: 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
fe20: 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
fe30: 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
fe40: 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
fe50: 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
fe60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
fe70: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
fe80: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
fe90: 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
fea0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
feb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fec0: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
fed0: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
fee0: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
fef0: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
ff00: 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
ff10: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
ff20: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
ff30: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
ff40: 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
ff50: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
ff60: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
ff70: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
ff80: 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
ff90: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
ffa0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
ffb0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
ffc0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
ffd0: 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
ffe0: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
fff0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
10000 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
10010 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
10020 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
10030 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
10040 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
10050 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
10060 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10070 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
10080 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
10090 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
100a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
100b0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
100c0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
100d0 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
100e0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
100f0 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
10100 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
10110 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
10120 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
10130 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
10140 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
10150 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
10160 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
10170 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
10180 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
10190 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
101a0 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
101b0 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
101c0 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
101d0 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
101e0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
101f0 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
10200 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
10210 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
10220 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
10230 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
10240 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
10250 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
10260 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
10270 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
10280 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
10290 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
102a0 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
102b0 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
102c0 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
102d0 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
102e0 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
102f0 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
10300 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
10310 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
10320 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
10330 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
10340 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
10350 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
10360 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
10370 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
10380 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
10390 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
103a0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
103b0 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
103c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
103d0 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
103e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
103f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
10400 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
10410 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10440 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
10450 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
10460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
10470 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
10480 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
10490 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
104b0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
104c0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
104d0 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
104e0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
104f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10500 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
10510 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
10520 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10540 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
10550 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
10560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10570 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
10580 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
10590 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
105a0 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
105b0 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
105c0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
105d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
105e0 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70  _MEMORY .   || p
105f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10600 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10610 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a  LMODE_OFF .  ){.
10620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10630 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10640 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10650 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  1;.  assert( isO
10660 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
10670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10680 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10690 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
106a0 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20  nalOff );..  /* 
106b0 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65  Calculate the le
106c0 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e  ngth in bytes an
106d0 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  d the checksum o
106e0 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66  f zMaster */.  f
106f0 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d  or(nMaster=0; zM
10700 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20  aster[nMaster]; 
10710 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20  nMaster++){.    
10720 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
10730 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a  [nMaster];.  }..
10740 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
10750 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
10760 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
10770 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
10780 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
10790 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
107a0 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
107b0 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
107c0 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
107d0 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
107e0 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
107f0 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
10800 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
10810 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
10820 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10830 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
10840 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
10850 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
10860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10870 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  Off;..  /* Write
10880 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10890 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20  nal data to the 
108a0 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
108b0 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a  al file. If.  **
108c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
108d0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
108e0 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
108f0 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  aller..  */.  if
10900 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  ( (0 != (rc = wr
10910 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
10920 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20  ->jfd, iHdrOff, 
10930 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
10940 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28  ager)))).   || (
10950 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
10960 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
10970 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
10980 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66  nMaster, iHdrOff
10990 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  +4))).   || (0 !
109a0 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
109b0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
109c0 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
109d0 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20  er, nMaster))). 
109e0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
109f0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10a00 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10a10 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63  f+4+nMaster+4, c
10a20 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30  ksum))).   || (0
10a30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10a40 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10a50 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
10a60 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b  gic, 8, iHdrOff+
10a70 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
10a80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10a90 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
10aa0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
10ab0 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
10ac0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
10ad0 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
10ae0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
10af0 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
10b00 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
10b10 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
10b20 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
10b30 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10b40 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
10b50 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
10b60 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
10b70 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
10b80 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
10b90 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
10ba0 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
10bb0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
10bc0 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
10bd0 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
10be0 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
10bf0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
10c00 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
10c10 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
10c20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
10c30 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
10c40 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
10c50 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
10c60 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
10c70 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
10c80 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
10c90 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
10ca0 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
10cb0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
10cc0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
10cd0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
10ce0 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
10cf0 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
10d00 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
10d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10d20 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
10d30 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
10d40 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
10d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10d60 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
10d70 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
10d80 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
10d90 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e  e number. Return
10da0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
10db0 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
10dc0 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  L if the request
10dd0 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a  ed page is not .
10de0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
10df0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
10e00 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
10e10 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
10e20 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
10e30 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
10e60 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  ue */..  /* It i
10e70 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
10e80 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61  or a call to Pca
10e90 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20  cheFetch() with 
10ea0 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f  createFlag==0 to
10eb0 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63  .  ** fail, sinc
10ec0 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e no attempt to 
10ed0 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63  allocate dynamic
10ee0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
10ef0 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f  made..  */.  (vo
10f00 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65  id)sqlite3Pcache
10f10 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
10f20 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
10f30 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
10f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
10f50 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
10f60 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
10f70 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
10f80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
10f90 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
10fa0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10fb0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
10fc0 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
10fd0 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ckup);.  sqlite3
10fe0 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
10ff0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
11000 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11010 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11020 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
11030 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
11040 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
11050 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
11060 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
11070 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
11080 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
11090 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
110a0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
110b0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
110c0 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
110d0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
110e0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
110f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11100 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11110 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11120 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
11130 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
11140 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11150 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
11160 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
11170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
11180 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11190 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
111a0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
111b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
111c0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
111d0 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d  de || sqlite3IsM
111e0 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
111f0 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
11200 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
11210 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
11220 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11230 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11240 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
11250 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
11260 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
11270 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
11280 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
11290 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
112a0 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
112b0 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
112c0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
112d0 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
112e0 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
112f0 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
11300 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11310 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
11320 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
11330 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
11340 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
11350 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
11360 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
11370 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
11380 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
113b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
113c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
113d0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
113e0 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
113f0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
11400 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
11410 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
11420 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
11430 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
11440 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
11450 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
11460 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
11470 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
11480 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
11490 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
114a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
114b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
114c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
114d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
114e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
114f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11500 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11510 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
11520 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11530 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
11540 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
11550 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
11560 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
11570 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
11580 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
11590 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
115a0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
115b0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
115c0 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
115d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
115e0 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
115f0 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
11600 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
11610 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
11620 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
11630 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
11640 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11650 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
11660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
11670 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
11680 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
11690 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
116a0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
116b0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
116c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
116d0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
116e0 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
116f0 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
11700 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
11710 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
11720 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
11730 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
11740 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
11750 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
11760 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
11770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
11780 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
11790 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
117a0 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
117b0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
117c0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
117d0 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
117e0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
117f0 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
11800 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
11810 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
11820 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11830 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
11840 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
11850 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11860 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
11870 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
11880 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11890 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
118a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
118b0 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
118c0 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42    );..  sqlite3B
118d0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
118e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
118f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
11900 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
11910 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
11920 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
11930 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
11940 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
11950 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
11960 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
11970 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
11980 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
11990 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
119a0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
119b0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
119c0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
119d0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
119e0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11a10 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
11a20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
11a30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
11a40 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
11a50 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
11a60 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11a70 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
11a80 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
11a90 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
11aa0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
11ab0 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
11ac0 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
11ad0 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
11ae0 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
11af0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
11b00 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
11b10 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
11b20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
11b30 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
11b40 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
11b50 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
11b60 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
11b70 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
11b80 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11b90 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
11ba0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
11bb0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11bc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
11bd0 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
11be0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11bf0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11c00 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
11c10 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11c20 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11c30 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
11c40 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11c50 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11c60 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
11c70 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
11c80 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11c90 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
11ca0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
11cb0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
11cc0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
11cd0 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
11ce0 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
11cf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
11d00 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
11d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
11d20 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
11d30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11d40 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11d50 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11d60 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
11d70 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
11d80 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
11d90 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
11da0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
11db0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
11dc0 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
11dd0 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
11de0 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
11df0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
11e00 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
11e10 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
11e20 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
11e30 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
11e40 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
11e50 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
11e60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11e70 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
11e80 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
11e90 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
11ea0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
11eb0 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
11ec0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
11ed0 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
11ee0 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
11ef0 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
11f00 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
11f10 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
11f20 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
11f30 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
11f40 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
11f50 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
11f60 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
11f70 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
11f80 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
11f90 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
11fa0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
11fb0 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
11fc0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
11fd0 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
11fe0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
11ff0 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12000 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12010 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12020 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12030 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12040 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12050 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
12060 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
12070 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
12080 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12090 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
120a0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
120b0 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
120c0 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
120d0 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
120e0 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
120f0 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12100 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12110 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12120 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12130 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12140 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
12150 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
12160 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
12170 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12180 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
12190 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
121a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
121b0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
121c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
121d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
121e0 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
121f0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
12200 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12210 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
12220 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
12230 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
12240 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12250 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45   whenever an IOE
12260 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72  RR or FULL error
12270 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a   that requires.*
12280 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74  * the pager to t
12290 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74  ransition into t
122a0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d  he ERROR state m
122b0 61 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64  ay ahve occurred
122c0 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  ..** The first a
122d0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
122e0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
122f0 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
12300 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20   second .** the 
12310 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
12320 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
12330 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
12340 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a  unction. The .**
12350 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
12360 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
12370 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12380 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
12390 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
123a0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
123b0 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c   is SQLITE_FULL,
123c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
123d0 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49   one of the.** I
123e0 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20  OERR sub-codes, 
123f0 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
12400 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12410 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
12420 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ode.** is stored
12430 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64   in Pager.errCod
12440 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  e. While the pag
12450 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68  er remains in th
12460 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a  e ERROR state,.*
12470 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20  * all major API 
12480 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67  calls on the Pag
12490 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
124a0 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72  ely return Pager
124b0 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  .errCode..**.** 
124c0 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  The ERROR state 
124d0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
124e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
124f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
12500 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
12510 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
12520 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
12530 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
12540 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
12550 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12560 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
12570 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
12580 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
12590 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
125a0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
125b0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
125c0 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
125d0 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
125e0 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
125f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12610 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
12620 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
12630 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
12640 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
12650 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
12660 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
12670 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
12680 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
12690 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
126a0 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  );.  assert(.   
126b0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
126c0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
126d0 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
126e0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
126f0 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
12700 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
12710 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
12720 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
12730 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55  ( rc2==SQLITE_FU
12740 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54  LL || rc2==SQLIT
12750 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70  E_IOERR ){.    p
12760 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12770 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
12780 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12790 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
127a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
127b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
127c0 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
127d0 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
127e0 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
127f0 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
12800 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
12810 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
12820 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
12830 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
12840 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
12850 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
12860 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
12870 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
12880 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
12890 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
128a0 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
128b0 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
128c0 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
128d0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
128e0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
128f0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
12900 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
12910 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
12920 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
12930 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
12940 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
12950 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
12960 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
12970 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
12980 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
12990 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
129a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
129b0 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
129c0 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
129d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
129e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
129f0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
12a00 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
12a10 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
12a20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
12a30 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
12a40 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
12a50 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
12a60 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
12a70 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
12a80 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
12a90 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
12aa0 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
12ab0 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
12ac0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
12ad0 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
12ae0 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
12af0 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
12b00 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
12b10 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
12b20 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
12b30 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
12b40 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
12b50 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
12b60 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
12b70 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
12b80 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12b90 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
12ba0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
12bb0 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
12bc0 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
12bd0 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
12be0 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
12bf0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
12c00 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
12c10 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
12c20 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
12c30 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
12c40 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
12c50 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12c60 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
12c70 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
12c80 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
12c90 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
12ca0 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
12cb0 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
12cc0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
12cd0 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
12ce0 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
12cf0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
12d00 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
12d10 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
12d20 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
12d30 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
12d40 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12d50 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
12d60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
12d70 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
12d80 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
12d90 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
12da0 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
12db0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
12dc0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12dd0 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
12de0 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
12df0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
12e00 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
12e10 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
12e20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
12e30 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
12e40 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
12e50 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
12e60 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
12e70 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
12e80 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
12e90 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
12ea0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
12eb0 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
12ec0 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12ed0 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
12ee0 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
12ef0 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
12f00 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
12f10 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
12f20 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
12f30 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
12f40 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
12f50 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
12f60 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
12f70 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
12f80 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
12f90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12fa0 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
12fb0 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
12fc0 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
12fd0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
12fe0 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
12ff0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
13000 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
13010 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13020 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
13030 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
13040 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
13050 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13060 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
13070 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
13080 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
13090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
130a0 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
130b0 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
130c0 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
130d0 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
130e0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
130f0 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
13100 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
13110 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
13120 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
13130 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
13140 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
13150 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
13160 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
13170 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
13180 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
13190 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
131a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
131b0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
131c0 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
131d0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
131e0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
131f0 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
13200 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
13210 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
13220 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
13230 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
13240 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
13250 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
13260 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
13270 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
13280 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
13290 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
132a0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
132b0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
132c0 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
132d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
132e0 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
132f0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
13300 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
13310 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
13320 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
13330 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
13340 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
13350 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
13360 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
13370 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
13380 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
13390 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
133a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
133b0 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
133c0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
133d0 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
133e0 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
133f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
13400 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
13410 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
13420 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
13430 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
13440 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
13450 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13460 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
13470 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
13480 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
13490 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
134a0 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
134b0 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
134c0 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
134d0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
134e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
134f0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
13500 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
13510 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
13520 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
13530 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
13540 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
13550 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
13560 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
13570 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
13580 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13590 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
135a0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
135b0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
135c0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
135d0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
135e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
135f0 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
13600 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
13610 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
13620 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
13630 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
13640 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13650 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
13660 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d  if( sqlite3IsMem
13670 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
13680 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
13690 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
136a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
136b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
136c0 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ORY );.      sql
136d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
136e0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
136f0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13700 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13710 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
13720 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
13730 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13740 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
13750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13760 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
13770 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13780 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
13790 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
137a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
137b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
137c0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
137d0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
137e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
137f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
13800 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
13810 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
13820 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
13830 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
13840 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13850 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
13860 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
13870 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
13880 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
13890 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
138a0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
138b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
138c0 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
138d0 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
138e0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
138f0 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
13900 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
13910 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
13920 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
13930 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
13940 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
13950 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
13960 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
13970 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
13980 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
13990 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
139a0 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
139b0 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
139c0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a  emory journal. .
139d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
139e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
139f0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13a00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
13a10 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20  LETE .          
13a20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
13a30 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13a40 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
13a50 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y .           ||
13a60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13a70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13a80 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
13a90 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
13aa0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13ab0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
13ac0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
13ad0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
13ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
13af0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
13b00 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
13b10 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
13b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
13b30 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
13b40 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50  PAGES.  sqlite3P
13b50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
13b60 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
13b70 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
13b80 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50  ehash);.  if( pP
13b90 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20  ager->dbSize==0 
13ba0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
13bb0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
13bc0 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
13bd0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61     PgHdr *p = pa
13be0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
13bf0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
13c00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67   ){.      p->pag
13c10 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  eHash = 0;.     
13c20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
13c30 65 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ef(p);.    }.  }
13c40 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
13c50 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
13c60 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
13c70 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
13c80 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
13c90 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
13ca0 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  0;.  sqlite3Pcac
13cb0 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
13cc0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73  r->pPCache);.  s
13cd0 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
13ce0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
13cf0 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62  ache, pPager->db
13d00 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61  Size);..  if( pa
13d10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13d20 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70  ) ){.    /* Drop
13d30 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c   the WAL write-l
13d40 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73  ock, if any. Als
13d50 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  o, if the connec
13d60 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20  tion was in .   
13d70 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   ** locking_mode
13d80 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
13d90 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
13da0 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  , drop the EXCLU
13db0 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  SIVE .    ** loc
13dc0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  k held on the da
13dd0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
13de0 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71   */.    rc2 = sq
13df0 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65  lite3WalEndWrite
13e00 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
13e10 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61  er->pWal);.    a
13e20 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49  ssert( rc2==SQLI
13e30 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
13e40 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
13e50 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26  usiveMode .   &&
13e60 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70   (!pagerUseWal(p
13e70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65  Pager) || sqlite
13e80 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
13e90 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
13ea0 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32  0)).  ){.    rc2
13eb0 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
13ec0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
13ed0 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
13ee0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
13ef0 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ne = 0;.  }.  pP
13f00 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
13f10 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70  AGER_READER;.  p
13f20 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
13f30 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
13f40 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
13f50 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
13f60 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
13f70 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
13f80 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
13f90 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
13fa0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
13fb0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
13fc0 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
13fd0 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
13fe0 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  OR state, do not
13ff0 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65   attempt .** the
14000 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69   rollback at thi
14010 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c  s time. Instead,
14020 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
14030 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a  is called. The.*
14040 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
14050 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69  unlock() will di
14060 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
14070 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63  ory pages, unloc
14080 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  k.** the databas
14090 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20  e file and move 
140a0 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
140b0 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66  o OPEN state. If
140c0 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20   this .** means 
140d0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
140e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  hot-journal left
140f0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
14100 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a  tem, the next .*
14110 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * connection to 
14120 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
14130 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
14140 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  r (which may be 
14150 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69  this one) .** wi
14160 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ll roll it back.
14170 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14180 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
14190 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
141a0 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74  ERROR state, but
141b0 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
141c0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
141d0 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
141e0 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
141f0 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
14200 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
14210 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
14220 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
14230 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
14240 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
14250 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
14260 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
14270 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
14280 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
14290 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
142a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
142b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
142c0 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
142d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
142e0 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
142f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
14300 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
14310 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  er) );.    if( p
14320 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
14330 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
14340 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ED ){.      sqli
14350 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
14360 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71  lloc();.      sq
14370 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
14380 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14390 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
143a0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
143b0 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
143c0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
143d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
143e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
143f0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
14400 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e  ;.      pager_en
14410 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
14420 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
14430 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
14440 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
14450 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
14460 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
14470 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
14480 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
14490 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
144a0 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
144b0 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
144c0 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
144d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
144e0 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
144f0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
14500 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
14510 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
14520 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
14530 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
14540 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
14550 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
14560 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
14570 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
14580 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
14590 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
145a0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
145b0 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
145c0 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
145d0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
145e0 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
145f0 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
14600 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
14610 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
14620 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
14630 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
14640 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
14650 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
14660 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
14670 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
14680 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
14690 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
146a0 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
146b0 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
146c0 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
146d0 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
146e0 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
146f0 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
14700 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
14710 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
14720 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
14730 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
14740 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
14750 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
14760 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
14770 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
14780 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
14790 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
147a0 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
147b0 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
147c0 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
147d0 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
147e0 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
147f0 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
14800 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
14810 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
14820 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
14830 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
14840 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
14850 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
14860 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
14870 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
14880 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
14890 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
148a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
148b0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
148c0 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
148d0 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
148e0 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
148f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
14900 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  m;.}../*.** Repo
14910 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
14920 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
14930 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
14940 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
14950 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
14960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
14970 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
14980 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
14990 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
149a0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
149b0 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
149c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
149d0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
149e0 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
149f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
14a20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
14a30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
14a40 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
14a50 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
14a60 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
14a70 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
14a80 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
14a90 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
14aa0 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
14ab0 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
14ac0 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
14ad0 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
14ae0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
14af0 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
14b00 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
14b10 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
14b20 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
14b30 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
14b40 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
14b50 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
14b60 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
14b70 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
14b80 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
14b90 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
14ba0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  nal..**.** The m
14bb0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
14bc0 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73  rnal uses checks
14bd0 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
14be0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
14bf0 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   .** not..**.** 
14c00 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
14c10 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
14c20 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
14c30 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
14c40 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
14c50 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
14c60 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
14c70 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
14c80 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
14c90 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
14ca0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
14cb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
14cc0 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
14cd0 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
14ce0 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
14cf0 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
14d00 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
14d10 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
14d20 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
14d30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
14d40 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
14d50 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
14d60 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
14d70 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
14d80 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
14d90 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
14da0 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
14db0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
14dc0 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
14dd0 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
14de0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
14df0 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
14e00 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
14e10 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
14e20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
14e30 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
14e40 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
14e50 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14e60 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
14e70 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
14e80 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
14e90 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
14ea0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
14eb0 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
14ec0 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
14ed0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
14ee0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
14ef0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
14f00 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
14f10 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
14f20 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
14f30 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
14f40 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
14f50 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
14f60 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
14f70 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
14f80 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
14f90 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
14fa0 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
14fb0 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
14fc0 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
14fd0 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
14fe0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
14ff0 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
15000 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
15010 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
15020 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
15030 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
15040 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
15050 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
15060 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
15070 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
15080 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
15090 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
150a0 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
150b0 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
150c0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
150d0 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
150e0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
150f0 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
15100 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
15110 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
15120 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
15130 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
15140 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
15150 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
15160 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
15170 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
15180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15190 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
151a0 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
151b0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
151c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
151d0 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
151e0 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
151f0 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
15200 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
15210 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
15220 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
15230 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
15240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
15250 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
15260 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
15270 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
15280 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
15290 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
152a0 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
152b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
152c0 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
152f0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15300 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
15310 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15330 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
15340 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
15350 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
15360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15370 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
15380 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
15390 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
153a0 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
153d0 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
153e0 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
153f0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
15400 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
15410 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
15420 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
15430 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
15440 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15450 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
15460 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
15470 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
15480 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
15490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
154a0 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
154b0 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
154c0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
154d0 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
154e0 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
154f0 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
15500 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
15510 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
15520 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
15530 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
15540 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
15550 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
15560 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
15570 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
15580 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
15590 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
155a0 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
155b0 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
155c0 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
155d0 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
155e0 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
155f0 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
15600 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
15610 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
15620 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
15630 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
15640 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
15650 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
15660 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
15670 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
15680 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
15690 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65  Either the state
156a0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
156b0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
156c0 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61  CHEMOD (a transa
156d0 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73  ction .  ** or s
156e0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
156f0 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65  k done at the re
15700 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c  quest of the cal
15710 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a  ler) or this is.
15720 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
15730 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20  al rollback. If 
15740 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  it is a hot-jour
15750 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  nal rollback, th
15760 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20  e pager.  ** is 
15770 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e  in state OPEN an
15780 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55  d holds an EXCLU
15790 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a  SIVE lock. Hot-j
157a0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
157b0 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20    ** only reads 
157c0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
157d0 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73  urnal, not the s
157e0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ub-journal..  */
157f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15800 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
15810 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15820 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
15830 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
15840 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
15850 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
15860 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20  VE_LOCK).  );.  
15870 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15880 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
15890 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c  ITER_CACHEMOD ||
158a0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a   isMainJrnl );..
158b0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
158c0 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
158d0 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
158e0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
158f0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
15900 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
15910 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
15920 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
15930 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
15940 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
15950 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
15960 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
15970 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
15980 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
15990 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
159a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
159b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
159c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
159d0 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
159e0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
159f0 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
15a00 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
15a10 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
15a20 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
15a30 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
15a40 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
15a50 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
15a60 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
15a70 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
15a80 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
15a90 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
15aa0 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
15ab0 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
15ac0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
15ad0 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
15ae0 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
15af0 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
15b00 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
15b10 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
15b20 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
15b30 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
15b40 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
15b50 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
15b60 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
15b70 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
15b80 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
15b90 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
15ba0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
15bb0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
15bc0 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
15bd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15be0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
15bf0 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
15c00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
15c10 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
15c20 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
15c30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15c40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
15c50 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
15c60 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
15c70 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
15c80 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
15c90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
15ca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
15cb0 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
15cc0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
15cd0 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
15ce0 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
15cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
15d00 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
15d10 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
15d20 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
15d30 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f  n played by befo
15d40 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  re during the cu
15d50 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62  rrent.  ** rollb
15d60 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20  ack, then don't 
15d70 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69  bother to play i
15d80 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20  t back again..  
15d90 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  */.  if( pDone &
15da0 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
15db0 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
15dc0 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
15dd0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
15de0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  rc;.  }..  /* Wh
15df0 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  en playing back 
15e00 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20  page 1, restore 
15e10 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74  the nReserve set
15e20 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ting.  */.  if( 
15e30 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65  pgno==1 && pPage
15e40 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75  r->nReserve!=((u
15e50 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b  8*)aData)[20] ){
15e60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
15e70 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44  serve = ((u8*)aD
15e80 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61  ata)[20];.    pa
15e90 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
15ea0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
15eb0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
15ec0 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61   in CACHEMOD sta
15ed0 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
15ee0 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
15ef0 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
15f00 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
15f10 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
15f20 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
15f30 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
15f40 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
15f50 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
15f60 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
15f70 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
15f80 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
15f90 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
15fa0 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
15fb0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
15fc0 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
15fd0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
15fe0 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
15ff0 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
16000 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
16010 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
16020 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
16030 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
16040 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
16050 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
16060 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
16070 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
16080 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
16090 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
160a0 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
160b0 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
160c0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
160d0 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
160e0 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
160f0 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
16100 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
16110 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57   WRITER_DBMOD, W
16120 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f  RITER_FINISHED o
16130 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
16140 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
16150 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68  .  ** pager cach
16160 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61  e if it exists a
16170 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
16180 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
16190 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20  en marked .  ** 
161a0 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65  not dirty. Since
161b0 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e   this code is on
161c0 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50  ly executed in P
161d0 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
161e0 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a  for.  ** a hot-j
161f0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
16200 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
16210 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
16220 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20  cache is empty. 
16230 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72   ** if the pager
16240 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74   is in OPEN stat
16250 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  e..  **.  ** Tic
16260 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
16270 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
16280 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
16290 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
162a0 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
162b0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
162c0 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
162d0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
162e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
162f0 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
16300 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
16310 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
16320 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
16330 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
16340 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
16350 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
16360 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
16370 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
16380 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
16390 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
163a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
163b0 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
163c0 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
163d0 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
163e0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
163f0 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
16400 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
16410 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
16420 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
16430 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
16440 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
16450 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
16460 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
16470 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
16480 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
16490 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
164a0 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
164b0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
164c0 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
164d0 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
164e0 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
164f0 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
16500 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
16510 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
16520 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
16530 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
16540 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
16550 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
16560 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
16570 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
16580 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
16590 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
165a0 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
165b0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
165c0 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
165d0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
165e0 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
165f0 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
16600 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
16610 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
16620 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
16630 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
16640 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
16650 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
16660 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
16670 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
16680 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
16690 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
166a0 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
166b0 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
166c0 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
166d0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
166e0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
166f0 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
16700 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
16710 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
16720 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73   pgno);.  }.  as
16730 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
16740 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
16750 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
16760 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
16770 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  Pg==0 );.  PAGER
16780 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
16790 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
167a0 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
167b0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
167c0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
167d0 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
167e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
167f0 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20   (u8*)aData),.  
16800 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
16810 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
16820 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
16830 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69  ").  ));.  if( i
16840 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
16850 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67   isSynced = pPag
16860 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a  er->noSync || (*
16870 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65  pOffset <= pPage
16880 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
16890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53    }else{.    isS
168a0 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20  ynced = (pPg==0 
168b0 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
168c0 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
168d0 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  YNC));.  }.  if(
168e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
168f0 66 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65  fd).   && (pPage
16900 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
16910 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
16920 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
16930 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20  =PAGER_OPEN).   
16940 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
16950 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
16960 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
16970 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
16980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
16990 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
169a0 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
169b0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
169c0 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
169d0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
169e0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
169f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
16a00 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
16a10 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
16a20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
16a30 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
16a40 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
16a50 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
16a60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
16a70 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
16a80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16a90 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
16aa0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
16ab0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
16ac0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
16ad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
16ae0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
16af0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
16b00 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
16b10 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
16b20 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
16b30 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
16b40 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
16b50 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16b60 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
16b70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
16b80 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
16b90 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
16ba0 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
16bb0 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
16bc0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
16bd0 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
16be0 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
16bf0 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
16c00 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
16c10 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
16c20 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
16c30 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
16c40 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
16c50 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
16c60 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
16c70 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
16c80 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
16c90 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
16ca0 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
16cb0 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
16cc0 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
16cd0 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
16ce0 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
16cf0 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
16d00 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
16d10 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
16d20 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
16d30 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
16d40 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
16d50 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
16d60 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
16d70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
16d80 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
16d90 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
16da0 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
16db0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
16dc0 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
16dd0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
16de0 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
16df0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
16e00 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
16e10 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
16e20 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
16e30 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
16e40 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
16e50 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
16e60 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
16e70 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
16e80 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
16e90 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
16ea0 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
16eb0 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
16ec0 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
16ed0 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
16ee0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
16ef0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
16f00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16f10 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29  >doNotSpill==0 )
16f20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
16f30 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20  NotSpill++;.    
16f40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16f50 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
16f60 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
16f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16f80 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d  ger->doNotSpill=
16f90 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
16fa0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a  ->doNotSpill--;.
16fb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16fc0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
16fd0 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
16fe0 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
16ff0 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
17000 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
17010 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
17020 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
17030 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
17040 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
17050 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
17060 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
17070 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
17080 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
17090 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
170a0 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
170b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
170c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
170d0 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
170e0 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
170f0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
17100 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
17110 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
17120 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
17130 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
17140 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
17150 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
17160 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
17170 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
17180 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
17190 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
171a0 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
171b0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
171c0 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
171d0 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
171e0 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
171f0 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
17200 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
17210 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
17220 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
17230 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
17240 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
17250 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
17260 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
17270 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
17280 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
17290 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
172a0 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
172b0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
172c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
172d0 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
172e0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
172f0 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
17300 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
17310 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
17320 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
17330 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
17340 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
17350 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
17360 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
17370 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
17380 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
17390 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
173a0 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
173b0 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
173c0 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
173d0 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
173e0 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
173f0 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
17400 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
17410 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
17420 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
17430 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
17440 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
17450 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
17460 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
17470 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
17480 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
17490 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
174a0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
174b0 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
174c0 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
174d0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
174e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
174f0 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
17500 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
17510 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
17520 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
17530 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
17540 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
17550 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
17560 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
17570 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
17580 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
17590 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
175a0 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
175b0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
175c0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
175d0 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
175e0 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
175f0 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
17600 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
17610 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
17620 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
17630 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
17640 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
17650 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
17660 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
17670 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
17680 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
17690 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
176a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
176b0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
176c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
176d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
176e0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
176f0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
17700 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
17710 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
17720 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
17730 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
17740 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
17750 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
17760 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
17770 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
17780 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
17790 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
177a0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
177b0 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
177c0 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
177d0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
177e0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
177f0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
17800 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
17810 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
17820 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
17830 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
17840 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
17850 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
17860 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
17870 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
17880 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17890 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
178a0 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
178b0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
178c0 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
178d0 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
178e0 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
178f0 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
17900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
17910 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
17920 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
17930 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
17940 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
17950 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
17960 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17970 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
17980 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
17990 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
179a0 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
179b0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
179c0 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
179d0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
179e0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
179f0 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
17a00 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
17a10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17a20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
17a30 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
17a40 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
17a50 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
17a60 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
17a70 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
17a80 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
17a90 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
17aa0 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
17ab0 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
17ac0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
17ad0 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
17ae0 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
17af0 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
17b00 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
17b10 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
17b20 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
17b30 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
17b40 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
17b50 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
17b60 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
17b70 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
17b80 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
17b90 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
17ba0 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
17bb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17bc0 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
17bd0 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
17be0 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
17bf0 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
17c00 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
17c10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
17c20 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
17c30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
17c40 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
17c50 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
17c60 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
17c70 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
17c80 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
17c90 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
17ca0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
17cb0 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
17cc0 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
17cd0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
17ce0 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
17cf0 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
17d00 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
17d10 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
17d20 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
17d30 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
17d40 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
17d50 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
17d60 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
17d70 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
17d80 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
17d90 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
17da0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
17db0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
17dc0 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
17dd0 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
17de0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
17df0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
17e00 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
17e10 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
17e20 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
17e30 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
17e40 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
17e50 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
17e60 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
17e70 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
17e80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
17e90 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
17ea0 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
17eb0 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
17ec0 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
17ed0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
17ee0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
17ef0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
17f00 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
17f10 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
17f20 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
17f30 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
17f40 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
17f50 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
17f60 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
17f70 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
17f80 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
17f90 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
17fa0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
17fb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
17fc0 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
17fd0 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
17fe0 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
17ff0 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
18000 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
18010 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
18020 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
18030 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
18040 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
18050 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
18060 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
18070 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
18080 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
180a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
180b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
180c0 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
180d0 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
180e0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
180f0 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
18100 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
18110 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
18120 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
18130 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
18140 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18150 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
18160 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
18170 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18180 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
18190 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
181a0 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
181b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
181c0 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
181d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
181e0 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a  Pointer to one j
181f0 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a  ournal within MJ
18200 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
18210 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20  *zMasterPtr;    
18220 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
18230 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d   hold MJ filenam
18240 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c  e from a journal
18250 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
18260 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18270 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
18280 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
18290 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b  d to zMasterPtr[
182a0 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ] */..  /* Alloc
182b0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
182c0 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
182d0 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
182e0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
182f0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
18300 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
18310 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
18320 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
18330 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
18340 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
18350 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
18360 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
18370 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
18380 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
18390 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
183a0 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
183b0 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
183c0 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
183d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
183e0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
183f0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
18400 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18410 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
18420 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
18430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18440 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
18450 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
18460 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
18470 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18480 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18490 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
184a0 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
184b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
184c0 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
184d0 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
184e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
184f0 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
18500 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
18510 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
18520 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
18530 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
18540 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
18550 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
18560 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
18570 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
18580 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
18590 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
185a0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
185b0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
185c0 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
185d0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
185e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
185f0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18600 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
18610 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
18620 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
18630 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
18640 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73  Malloc((int)nMas
18650 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
18660 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20  sterPtr + 1);.  
18670 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
18680 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
18690 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
186a0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
186b0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
186c0 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
186d0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
186e0 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
186f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
18700 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
18710 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
18720 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
18730 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18740 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18750 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
18760 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
18770 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
18780 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
18790 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
187a0 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
187b0 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
187c0 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
187d0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
187e0 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
187f0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
18800 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
18810 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
18820 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
18830 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
18850 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18870 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
18880 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
18890 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
188a0 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
188b0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
188c0 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
188d0 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
188e0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
188f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
18900 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
18910 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
18920 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
18930 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
18940 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18950 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
18960 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
18970 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
18980 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
18990 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
189a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
189b0 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
189c0 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
189d0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
189e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
189f0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
18a00 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18a10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
18a20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
18a30 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
18a40 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
18a50 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
18a60 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
18a70 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
18a80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18a90 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
18aa0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18ab0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
18ac0 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
18ad0 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
18ae0 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
18af0 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
18b00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
18b10 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
18b20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
18b30 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18b40 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
18b50 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
18b60 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
18b70 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
18b80 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
18b90 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
18ba0 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
18bb0 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
18bc0 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
18bd0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
18be0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
18bf0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
18c00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
18c10 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
18c20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
18c30 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
18c40 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
18c50 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
18c60 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
18c70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
18c80 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
18c90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
18ca0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18cb0 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
18cc0 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
18cd0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
18ce0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
18cf0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
18d00 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
18d10 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
18d20 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
18d30 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
18d40 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
18d50 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
18d60 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
18d70 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
18d80 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
18d90 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
18da0 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
18db0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
18dc0 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
18dd0 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
18de0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
18df0 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
18e00 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
18e10 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
18e20 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
18e30 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
18e40 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
18e50 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
18e60 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
18e70 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
18e80 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
18e90 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
18ea0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
18eb0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
18ec0 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
18ed0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
18ee0 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
18ef0 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
18f00 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
18f10 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
18f20 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
18f30 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
18f40 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
18f50 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
18f60 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
18f70 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
18f80 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
18f90 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
18fa0 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
18fb0 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
18fc0 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
18fd0 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
18fe0 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
18ff0 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
19000 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
19010 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
19020 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
19030 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
19040 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
19050 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
19060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
19070 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
19080 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
19090 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
190a0 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
190b0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
190c0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
190d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
190e0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
190f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
19100 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
19110 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19120 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45  eState!=PAGER_RE
19130 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28  ADER );.  .  if(
19140 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
19150 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67  fd) .   && (pPag
19160 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
19170 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
19180 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
19190 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20  ==PAGER_OPEN) . 
191a0 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
191b0 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
191c0 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  ;.    int szPage
191d0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
191e0 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
191f0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
19200 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
19210 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  ;.    /* TODO: I
19220 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65  s it safe to use
19230 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
19240 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72  e here? */.    r
19250 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
19260 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
19270 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b  , &currentSize);
19280 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73  .    newSize = s
19290 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65  zPage*(i64)nPage
192a0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
192b0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
192c0 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
192d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
192e0 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
192f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
19300 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
19310 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
19320 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
19330 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
19340 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65  ar *pTmp = pPage
19350 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
19360 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d        memset(pTm
19370 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20  p, 0, szPage);. 
19380 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19390 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
193a0 29 20 3c 20 20 63 75 72 72 65 6e 74 53 69 7a 65  ) <  currentSize
193b0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
193c0 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
193d0 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e  zPage) == curren
193e0 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
193f0 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
19400 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63  ize-szPage) >  c
19410 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
19420 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19430 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
19440 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61  ->fd, pTmp, szPa
19450 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61  ge, newSize-szPa
19460 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
19470 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19490 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
194a0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
194b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
194c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
194d0 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
194e0 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73  e of the Pager.s
194f0 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
19500 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  le for the given
19510 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20  .** pager based 
19520 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  on the value ret
19530 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
19540 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a  ctorSize method.
19550 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64  ** of the open d
19560 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
19570 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
19580 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20  ll be used used 
19590 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
195a0 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c   the size and al
195b0 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e  ignment of journ
195c0 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a  al header and .*
195d0 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
195e0 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e   pointers within
195f0 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c   created journal
19600 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   files..**.** Fo
19610 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
19620 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
19630 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
19640 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e  lways 512 bytes.
19650 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
19660 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72  , for non-tempor
19670 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65  ary files, the e
19680 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
19690 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76  size is.** the v
196a0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
196b0 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
196c0 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65  () method rounde
196d0 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a  d up to 32 if.**
196e0 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
196f0 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20   32, or rounded 
19700 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
19710 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
19720 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
19730 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19750 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
19760 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19770 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
19780 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
19790 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
197a0 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
197b0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
197c0 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
197d0 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
197e0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
197f0 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
19800 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
19810 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
19820 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
19830 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
19840 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
19850 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
19860 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ault..    */.   
19870 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
19880 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
19890 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
198a0 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->fd);.  }.  if(
198b0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
198c0 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20 70 50  ize<32 ){.    pP
198d0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
198e0 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66   = 512;.  }.  if
198f0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
19900 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
19910 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65  SIZE ){.    asse
19920 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  rt( MAX_SECTOR_S
19930 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20  IZE>=512 );.    
19940 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
19950 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ze = MAX_SECTOR_
19960 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  SIZE;.  }.}../*.
19970 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
19980 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
19990 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
199a0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
199b0 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
199c0 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
199d0 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
199e0 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
199f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
19a00 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
19a10 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
19a20 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
19a30 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
19a40 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
19a50 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
19a60 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
19a70 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
19a80 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
19a90 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
19aa0 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
19ab0 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
19ac0 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
19ad0 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
19ae0 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
19af0 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
19b00 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
19b10 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
19b20 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
19b30 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
19b40 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
19b50 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
19b60 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
19b70 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
19b80 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
19b90 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
19ba0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
19bb0 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
19bc0 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
19bd0 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
19be0 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
19bf0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
19c00 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
19c10 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   is the sector s
19c20 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72  ize.  The header
19c30 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69  .**       is thi
19c40 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20  s many bytes in 
19c50 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34  size..**  (6)  4
19c60 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
19c70 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
19c80 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  s the page size.
19c90 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70  .**  (7)  zero p
19ca0 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68  adding out to th
19cb0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69  e next sector si
19cc0 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72  ze..**  (8)  Zer
19cd0 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
19ce0 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
19cf0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
19d00 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
19d10 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
19d20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
19d30 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
19d40 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
19d50 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
19d60 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
19d70 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
19d80 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
19d90 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
19da0 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76  rst 7 items abov
19db0 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
19dc0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
19dd0 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
19de0 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a  f the 8th item..
19df0 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
19e00 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
19e10 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
19e20 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
19e30 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
19e40 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
19e50 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
19e60 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
19e70 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
19e80 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
19e90 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
19ea0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
19eb0 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
19ec0 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
19ed0 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
19ee0 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
19ef0 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
19f00 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
19f10 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
19f20 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
19f30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
19f40 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
19f50 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
19f60 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
19f70 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
19f80 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
19f90 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
19fa0 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
19fb0 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
19fc0 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
19fd0 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
19fe0 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
19ff0 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
1a000 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
1a010 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
1a020 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
1a030 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
1a040 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
1a050 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
1a060 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
1a070 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
1a080 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
1a090 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
1a0a0 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
1a0b0 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
1a0c0 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
1a0d0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
1a0e0 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
1a0f0 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
1a100 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
1a110 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
1a120 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
1a130 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
1a140 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
1a150 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
1a160 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
1a170 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
1a180 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
1a190 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
1a1a0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
1a1b0 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
1a1c0 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
1a1d0 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
1a1e0 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
1a1f0 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
1a200 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
1a210 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
1a220 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
1a230 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
1a240 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
1a250 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
1a260 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
1a270 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1a280 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
1a290 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
1a2a0 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
1a2b0 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
1a2c0 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
1a2d0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
1a2e0 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
1a2f0 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
1a300 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
1a310 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1a320 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ned..**.** The i
1a330 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69  sHot parameter i
1a340 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65  ndicates that we
1a350 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
1a360 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ollback a journa
1a370 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20  l.** that might 
1a380 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  be a hot journal
1a390 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20  .  Or, it could 
1a3a0 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  be that the jour
1a3b0 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65  nal is .** prese
1a3c0 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rved because of 
1a3d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
1a3e0 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f  IST or JOURNALMO
1a3f0 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20  DE_TRUNCATE..** 
1a400 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  If the journal r
1a410 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65  eally is hot, re
1a420 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61  set the pager ca
1a430 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e  che prior rollin
1a440 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f  g.** back any co
1a450 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a  ntent.  If the j
1a460 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79  ournal is merely
1a470 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20   persistent, no 
1a480 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64  reset is.** need
1a490 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1a4a0 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
1a4b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1a4c0 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
1a4d0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
1a4e0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
1a4f0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
1a500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1a510 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1a520 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
1a530 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a550 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
1a560 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
1a570 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
1a5a0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
1a5b0 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
1a5c0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1a5d0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
1a5e0 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
1a5f0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1a600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a610 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
1a620 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1a630 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
1a640 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1a650 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1a660 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a  ite3OsAccess() *
1a670 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
1a680 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
1a690 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
1a6a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
1a6b0 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64  ny */.  int need
1a6c0 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20  PagerReset;     
1a6d0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
1a6e0 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  t page prior to 
1a6f0 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62  first page rollb
1a700 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  ack */..  /* Fig
1a710 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1a720 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
1a730 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
1a740 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
1a750 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
1a760 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
1a770 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1a780 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
1a790 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1a7a0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1a7b0 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
1a7c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a7d0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1a7e0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
1a7f0 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
1a800 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
1a810 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1a820 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
1a830 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
1a840 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a850 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
1a860 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
1a870 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
1a880 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
1a890 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1a8a0 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
1a8b0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1a8c0 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
1a8d0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
1a8e0 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
1a8f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
1a900 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
1a910 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
1a920 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
1a930 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
1a940 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
1a950 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
1a960 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
1a970 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
1a980 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
1a990 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1a9a0 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
1a9b0 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68  .c,.  **  mxPath
1a9c0 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
1a9d0 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
1a9e0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
1a9f0 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
1aa00 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
1aa10 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
1aa20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1aa30 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
1aa40 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1aa50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1aa60 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1aa70 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1aa80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1aa90 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1aaa0 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
1aab0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1aac0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
1aad0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1aae0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
1aaf0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
1ab00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ab10 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
1ab20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1ab30 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
1ab40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1ab50 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
1ab60 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
1ab70 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
1ab80 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
1ab90 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
1aba0 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
1abb0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1abc0 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
1abd0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1abe0 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
1abf0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
1ac00 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
1ac10 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ){.    /* Read t
1ac20 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
1ac30 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
1ac40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
1ac50 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
1ac60 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
1ac70 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
1ac80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1ac90 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
1aca0 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
1acb0 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
1acc0 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
1acd0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  st have failed w
1ace0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
1acf0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
1ad00 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
1ad10 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
1ad20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
1ad30 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
1ad40 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
1ad50 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20  er, isHot, szJ, 
1ad60 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
1ad70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ad80 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
1ad90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1ada0 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
1adb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1adc0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1add0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1ade0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1adf0 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
1ae00 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
1ae10 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
1ae20 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
1ae30 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
1ae40 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
1ae50 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
1ae60 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
1ae70 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
1ae80 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
1ae90 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
1aea0 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
1aeb0 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
1aec0 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
1aed0 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
1aee0 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
1aef0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1af00 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
1af10 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
1af20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1af30 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1af40 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1af50 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
1af60 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
1af70 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1af80 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
1af90 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1afa0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1afb0 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
1afc0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
1afd0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
1afe0 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
1aff0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
1b000 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1b010 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
1b020 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
1b030 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
1b040 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
1b050 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b060 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
1b070 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
1b080 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
1b090 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
1b0a0 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
1b0b0 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
1b0c0 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
1b0d0 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
1b0e0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1b0f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
1b100 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
1b110 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
1b120 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
1b130 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
1b140 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
1b150 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
1b160 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
1b170 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
1b180 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
1b190 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
1b1a0 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
1b1b0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1b1c0 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
1b1d0 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
1b1e0 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
1b1f0 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
1b200 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
1b210 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
1b220 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1b230 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1b240 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
1b250 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
1b260 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1b270 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
1b280 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1b290 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
1b2a0 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
1b2b0 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
1b2c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
1b2d0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1b2e0 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
1b2f0 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
1b300 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b310 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
1b320 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
1b330 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1b340 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
1b350 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
1b360 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
1b370 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
1b380 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1b390 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1b3a0 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
1b3b0 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
1b3c0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
1b3d0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1b3e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
1b3f0 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
1b400 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
1b410 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1b420 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1b430 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1b440 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1b450 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1b460 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
1b470 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b480 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b490 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b4a0 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
1b4b0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1b4c0 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
1b4d0 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
1b4e0 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
1b4f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
1b500 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
1b510 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1b520 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67   file and/or pag
1b530 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a  e cache..    */.
1b540 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e      for(u=0; u<n
1b550 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20  Rec; u++){.     
1b560 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65   if( needPagerRe
1b570 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  set ){.        p
1b580 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1b590 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64  r);.        need
1b5a0 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a  PagerReset = 0;.
1b5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1b5c0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1b5d0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1b5e0 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r,&pPager->journ
1b5f0 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20  alOff,0,1,0);.  
1b600 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b610 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b620 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b630 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1b640 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b650 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1b660 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1b670 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
1b680 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1b690 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1b6a0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1b6b0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1b6c0 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
1b6d0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75  nal has been tru
1b6e0 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73  ncated, simply s
1b6f0 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a  top reading and.
1b700 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1b710 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72  cessing the jour
1b720 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20  nal. This might 
1b730 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f  happen if the jo
1b740 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20  urnal was.      
1b750 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c      ** not compl
1b760 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e  etely written an
1b770 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  d synced prior t
1b780 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74  o a crash.  In t
1b790 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1b7a0 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62   case, the datab
1b7b0 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ase should have 
1b7c0 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
1b7d0 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  en in the.      
1b7e0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61      ** first pla
1b7f0 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74  ce so it is OK t
1b800 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e  o simply abandon
1b810 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a   the rollback. *
1b820 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
1b830 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b840 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b850 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
1b860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b870 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
1b880 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
1b890 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75  k, quit and retu
1b8a0 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  rn the error.   
1b8b0 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20         ** code. 
1b8c0 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
1b8d0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
1b8e0 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
1b8f0 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ate.          **
1b900 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74   so that no furt
1b910 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65  her harm will be
1b920 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20   done.  Perhaps 
1b930 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20  the next.       
1b940 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f     ** process to
1b950 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c   come along will
1b960 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
1b970 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
1b980 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1b990 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1b9a0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1b9b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b9c0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
1b9d0 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
1b9e0 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
1b9f0 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c  ayback:.  /* Fol
1ba00 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1ba10 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1ba20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1ba30 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1ba40 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1ba50 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1ba60 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1ba70 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1ba80 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1ba90 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1baa0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1bab0 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1bac0 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1bad0 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1bae0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1baf0 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1bb00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20    */.  assert(. 
1bb10 20 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70     pPager->fd->p
1bb20 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20  Methods==0 ||.  
1bb30 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
1bb40 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
1bb50 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  d,SQLITE_FCNTL_D
1bb60 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d  B_UNCHANGED,0)>=
1bb70 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a  SQLITE_OK.  );..
1bb80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61    /* If this pla
1bb90 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69  yback is happeni
1bba0 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ng automatically
1bbb0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1bbc0 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d  an IO or .  ** m
1bbd0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74  alloc error that
1bbe0 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20   occurred after 
1bbf0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1bc00 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62  er was updated b
1bc10 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20  ut .  ** before 
1bc20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1bc30 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  was committed, t
1bc40 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hen the change-c
1bc50 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64  ounter .  ** mod
1bc60 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75  ification may ju
1bc70 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76  st have been rev
1bc80 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68  erted. If this h
1bc90 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73  appens in exclus
1bca0 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20  ive .  ** mode, 
1bcb0 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
1bcc0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72  transactions per
1bcd0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f  formed by the co
1bce0 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  nnection will no
1bcf0 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68  t.  ** update th
1bd00 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1bd10 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61   at all. This ma
1bd20 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20  y lead to cache 
1bd30 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20  inconsistency.  
1bd40 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  ** problems for 
1bd50 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
1bd60 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
1bd70 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c   the future. So,
1bd80 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61   just.  ** in ca
1bd90 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  se this has happ
1bda0 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20  ened, clear the 
1bdb0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1bdc0 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  flag now..  */. 
1bdd0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1bde0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
1bdf0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
1be00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1be10 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
1be20 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1be30 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
1be40 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1be50 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1be60 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1be70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1be80 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
1be90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bea0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1beb0 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
1bec0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1bed0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1bee0 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1bef0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1bf00 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  EN).  ){.    rc 
1bf10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
1bf20 6e 63 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nc(pPager);.  }.
1bf30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bf40 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1bf50 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
1bf60 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
1bf70 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
1bf80 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1bf90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1bfa0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1bfb0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1bfc0 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
1bfd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1bfe0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
1bff0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
1c000 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1c010 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
1c020 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
1c030 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
1c040 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1c050 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
1c060 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
1c070 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
1c080 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
1c090 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c0a0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
1c0b0 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1c0c0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1c0d0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1c0e0 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1c0f0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1c100 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1c110 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1c120 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1c130 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1c140 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1c150 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1c160 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1c170 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1c180 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1c190 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c1a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1c1b0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1c1c0 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1c1d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c1e0 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1c1f0 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1c200 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1c210 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1c220 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1c230 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1c240 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c250 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1c260 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1c270 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1c280 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1c290 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1c2a0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1c2b0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1c2c0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1c2d0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1c2e0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1c2f0 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1c300 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1c310 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1c320 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1c330 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1c340 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1c350 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1c360 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c370 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1c380 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1c390 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1c3a0 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1c3b0 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1c3c0 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1c3d0 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1c3e0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1c3f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1c400 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1c410 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61   */.  int isInWa
1c420 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1c430 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61     /* True if pa
1c440 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c  ge is in log fil
1c450 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1c460 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1c470 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1c480 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1c490 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1c4a0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1c4b0 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1c4c0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1c4d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c4e0 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
1c4f0 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
1c500 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
1c510 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c520 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1c530 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
1c540 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
1c550 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
1c560 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c570 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
1c580 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
1c590 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70  .    /* Try to p
1c5a0 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f  ull the page fro
1c5b0 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  m the write-ahea
1c5c0 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  d log. */.    rc
1c5d0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
1c5e0 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  d(pPager->pWal, 
1c5f0 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20  pgno, &isInWal, 
1c600 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
1c610 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c620 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69  =SQLITE_OK && !i
1c630 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36  sInWal ){.    i6
1c640 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1c650 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1c660 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1c670 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1c680 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1c690 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1c6a0 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1c6b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1c6c0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1c6d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c6e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c6f0 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1c700 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1c710 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1c720 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1c730 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1c740 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1c750 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1c760 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1c770 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1c780 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1c790 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1c7a0 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1c7b0 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1c7c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1c7d0 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1c7e0 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1c7f0 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1c800 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1c810 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1c820 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1c830 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1c840 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1c850 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1c860 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1c870 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1c880 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1c890 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1c8a0 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1c8b0 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1c8c0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1c8d0 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1c8e0 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1c8f0 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1c900 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1c910 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1c920 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1c930 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1c940 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1c950 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1c960 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1c970 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36  sing equaling 16
1c980 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69   bytes of 0xff i
1c990 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  s vanishingly sm
1c9a0 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20  all so.      ** 
1c9b0 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  we should still 
1c9c0 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  be ok..      */.
1c9d0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
1c9e0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1c9f0 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50   0xff, sizeof(pP
1ca00 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1ca10 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1ca20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56       u8 *dbFileV
1ca30 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
1ca40 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
1ca50 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1ca60 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1ca70 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1ca80 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1ca90 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20  eVers));.    }. 
1caa0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
1cab0 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
1cac0 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
1cad0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20  LITE_NOMEM);..  
1cae0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1caf0 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
1cb00 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
1cb10 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
1cb20 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
1cb30 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
1cb40 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1cb50 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
1cb60 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
1cb70 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1cb90 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1cba0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1cbb0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
1cbc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1cbd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cbe0 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
1cbf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1cc00 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
1cc10 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
1cc20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
1cc30 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1cc40 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
1cc50 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1cc60 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1cc70 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
1cc80 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
1cc90 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
1cca0 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
1ccb0 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
1ccc0 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
1ccd0 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1cce0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
1ccf0 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
1cd00 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
1cd10 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
1cd20 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1cd30 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
1cd40 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
1cd50 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
1cd60 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
1cd70 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
1cd80 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
1cd90 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
1cda0 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1cdb0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
1cdc0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
1cdd0 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
1cde0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
1cdf0 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
1ce00 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
1ce10 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1ce20 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
1ce30 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
1ce40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ce50 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
1ce60 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
1ce70 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1ce80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1ce90 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1cea0 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
1ceb0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
1cec0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1ced0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1cee0 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1cef0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1cf00 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1cf10 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1cf20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1cf30 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1cf40 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1cf50 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
1cf60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1cf70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cf80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1cf90 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1cfa0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1cfb0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1cfc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1cfd0 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  /* Normally, if 
1cfe0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1cff0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e   rolled back, an
1d000 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  y backup process
1d010 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61  es are.  ** upda
1d020 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63  ted as data is c
1d030 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
1d040 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1d050 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20  l and into the. 
1d060 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
1d070 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61  is is not genera
1d080 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74  lly possible wit
1d090 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  h a WAL database
1d0a0 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  , as.  ** rollba
1d0b0 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70  ck involves simp
1d0c0 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  ly truncating th
1d0d0 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72  e log file. Ther
1d0e0 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20  efore, if one.  
1d0f0 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65  ** or more frame
1d100 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
1d110 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1d120 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72  he log (and ther
1d130 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f  efore .  ** also
1d140 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
1d150 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65   backup database
1d160 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  s) as part of th
1d170 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  is transaction,.
1d180 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73    ** the backups
1d190 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74   must be restart
1d1a0 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
1d1b0 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
1d1c0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
1d1d0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1d1e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1d1f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1d200 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74   to rollback a t
1d210 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20  ransaction on a 
1d220 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  WAL database..*/
1d230 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1d240 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67  rRollbackWal(Pag
1d250 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1d260 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d280 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
1d290 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b  .  PgHdr *pList;
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69     /* List of di
1d2c0 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76  rty pages to rev
1d2d0 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72  ert */..  /* For
1d2e0 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
1d2f0 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65  e cache that are
1d300 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
1d310 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79   or have already
1d320 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  .  ** been writt
1d330 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d  en (but not comm
1d340 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f  itted) to the lo
1d350 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f  g file, do one o
1d360 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c  f the .  ** foll
1d370 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
1d380 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65     + Discard the
1d390 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66   cached page (if
1d3a0 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f   refcount==0), o
1d3b0 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61  r.  **   + Reloa
1d3c0 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66  d page content f
1d3d0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d3e0 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29   (if refcount>0)
1d3f0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1d400 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1d410 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
1d420 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55  rc = sqlite3WalU
1d430 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
1d440 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  , pagerUndoCallb
1d450 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  ack, (void *)pPa
1d460 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ger);.  pList = 
1d470 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1d480 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1d490 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65  PCache);.  while
1d4a0 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53  ( pList && rc==S
1d4b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d4c0 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
1d4d0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1d4e0 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
1d4f0 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a  Callback((void *
1d500 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  )pPager, pList->
1d510 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74  pgno);.    pList
1d520 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20   = pNext;.  }.. 
1d530 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1d540 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1d550 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1d560 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1d570 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1d580 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1d590 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1d5a0 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1d5b0 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1d5c0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1d5d0 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1d5e0 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1d5f0 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1d600 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1d610 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1d620 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1d630 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1d640 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1d650 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1d660 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1d670 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1d680 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1d690 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1d6a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d6b0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1d6c0 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1d6d0 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1d6e0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1d6f0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1d700 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1d710 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1d720 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1d730 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1d740 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1d750 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1d760 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d770 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1d780 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1d790 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1d7a0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1d7b0 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1d7c0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1d7d0 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1d7e0 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1d7f0 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1d800 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1d810 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1d820 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1d830 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1d840 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1d850 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1d860 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1d870 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1d880 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1d890 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1d8a0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1d8b0 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  NUMBER);.}../*.*
1d8c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d8d0 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
1d8e0 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72  und sqlite3WalFr
1d8f0 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20  ames(). As well 
1d900 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68  as logging.** th
1d910 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1d920 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1d930 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20  headed by pList 
1d940 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44  (connected by pD
1d950 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66  irty),.** this f
1d960 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73  unction notifies
1d970 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b   any active back
1d980 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61  up processes tha
1d990 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65  t the pages have
1d9a0 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
1d9b0 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70  ** The list of p
1d9c0 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f  ages passed into
1d9d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1d9e0 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62   always sorted b
1d9f0 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
1da00 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65  * Hence, if page
1da10 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68   1 appears anywh
1da20 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c  ere on the list,
1da30 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20   it will be the 
1da40 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a  first page..*/ .
1da50 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1da60 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1da70 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da90 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1daa0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1dad0 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1dae0 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1db10 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1db20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1db30 6d 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20 20  mmit,           
1db40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1db50 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1db60 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  mit */.  int syn
1db70 63 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  cFlags          
1db80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1db90 73 20 74 6f 20 70 61 73 73 20 74 6f 20 4f 73 53  s to pass to OsS
1dba0 79 6e 63 28 29 20 28 6f 72 20 30 29 20 2a 2f 0a  ync() (or 0) */.
1dbb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1dbe0 6f 64 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ode */.#if defin
1dbf0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1dc00 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1dc10 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 29 0a  TE_CHECK_PAGES).
1dc20 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1dc50 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 23   over pages */.#
1dc60 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1dc70 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b   pPager->pWal );
1dc80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1dc90 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
1dca0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6c   that the page l
1dcb0 69 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64  ist is in accend
1dcc0 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66  ing order */.  f
1dcd0 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26  or(p=pList; p &&
1dce0 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d   p->pDirty; p=p-
1dcf0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73  >pDirty){.    as
1dd00 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20  sert( p->pgno < 
1dd10 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20  p->pDirty->pgno 
1dd20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1dd30 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
1dd40 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
1dd50 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
1dd60 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73  pList);.  rc = s
1dd70 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1dd80 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20  pPager->pWal, . 
1dd90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
1dda0 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54  eSize, pList, nT
1ddb0 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69  runcate, isCommi
1ddc0 74 2c 20 73 79 6e 63 46 6c 61 67 73 0a 20 20 29  t, syncFlags.  )
1ddd0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1dde0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1ddf0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1de00 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
1de10 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1de20 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1de30 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1de40 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1de50 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
1de60 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
1de70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1de80 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1de90 50 41 47 45 53 0a 20 20 66 6f 72 28 70 3d 70 4c  PAGES.  for(p=pL
1dea0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1deb0 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  rty){.    pager_
1dec0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b  set_pagehash(p);
1ded0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
1dee0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1def0 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20  ** Begin a read 
1df00 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1df10 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  he WAL..**.** Th
1df20 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  is routine used 
1df30 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61  to be called "pa
1df40 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28  gerOpenSnapshot(
1df50 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73  )" because it es
1df60 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b  sentially.** mak
1df70 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66  es a snapshot of
1df80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
1df90 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69   the current poi
1dfa0 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70  nt in time and p
1dfb0 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74  reserves.** that
1dfc0 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73   snapshot for us
1dfd0 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20  e by the reader 
1dfe0 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63  in spite of conc
1dff0 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73  urrently changes
1e000 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69   by.** other wri
1e010 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69  ters or checkpoi
1e020 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nters..*/.static
1e030 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52   int pagerBeginR
1e040 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  eadTransaction(P
1e050 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e060 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1e090 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64  */.  int changed
1e0a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1e0b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e0c0 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65  cache must be re
1e0d0 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
1e0e0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1e0f0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
1e100 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1e110 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
1e120 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1e130 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
1e140 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61  ..  /* sqlite3Wa
1e150 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
1e160 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ion() was not ca
1e170 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65  lled for the pre
1e180 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73  vious.  ** trans
1e190 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e  action in lockin
1e1a0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
1e1b0 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f  .  So call it no
1e1c0 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61  w.  If we.  ** a
1e1d0 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  re in locking_mo
1e1e0 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e  de=NORMAL and En
1e1f0 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76  dRead() was prev
1e200 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20  iously called,. 
1e210 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74   ** the duplicat
1e220 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65  e call is harmle
1e230 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
1e240 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
1e250 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1e260 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73  pWal);..  rc = s
1e270 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65  qlite3WalBeginRe
1e280 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
1e290 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61  ager->pWal, &cha
1e2a0 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21  nged);.  if( rc!
1e2b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68  =SQLITE_OK || ch
1e2c0 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67  anged ){.    pag
1e2d0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1e2e0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1e2f0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1e300 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e310 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
1e320 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1e330 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52  ition from PAGER
1e340 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45  _OPEN.** to PAGE
1e350 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74  R_READER state t
1e360 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1e370 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1e380 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20  base file.** in 
1e390 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20  pages (assuming 
1e3a0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75  the page size cu
1e3b0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1e3c0 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  n Pager.pageSize
1e3d0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  )..**.** If no e
1e3e0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
1e3f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1e400 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ed and the size 
1e410 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
1e420 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73  ** in pages is s
1e430 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65  tored in *pnPage
1e440 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
1e450 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68  error code (perh
1e460 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  aps.** SQLITE_IO
1e470 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65  ERR_FSTAT) is re
1e480 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
1e490 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ge is left unmod
1e4a0 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
1e4b0 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f   int pagerPageco
1e4c0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
1e4d0 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29  r, Pgno *pnPage)
1e4e0 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20  {.  Pgno nPage; 
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e500 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
1e510 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
1e520 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72  ge */..  /* Quer
1e530 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  y the WAL sub-sy
1e540 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74  stem for the dat
1e550 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20  abase size. The 
1e560 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a  WalDbsize().  **
1e570 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1e580 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41  s zero if the WA
1e590 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69  L is not open (i
1e5a0 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d  .e. Pager.pWal==
1e5b0 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74  0), or.  ** if t
1e5c0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1e5d0 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
1e5e0 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  e. The database 
1e5f0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  size is not.  **
1e600 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
1e610 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1e620 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69  em if the log fi
1e630 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20  le is empty or. 
1e640 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
1e650 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20  valid committed 
1e660 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20  transactions..  
1e670 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1e680 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1e690 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
1e6a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1e6b0 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
1e6c0 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  || pPager->noRea
1e6d0 64 6c 6f 63 6b 20 29 3b 0a 20 20 6e 50 61 67 65  dlock );.  nPage
1e6e0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73   = sqlite3WalDbs
1e6f0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ize(pPager->pWal
1e700 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1e710 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1e720 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
1e730 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62  from the WAL sub
1e740 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65  -system,.  ** de
1e750 74 65 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64  termine it based
1e760 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20   on the size of 
1e770 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e780 65 2e 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20  e. If the size. 
1e790 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62   ** of the datab
1e7a0 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
1e7b0 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
1e7c0 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
1e7d0 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64  size,.  ** round
1e7e0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61   down to the nea
1e7f0 72 65 73 74 20 70 61 67 65 2e 20 45 78 63 65 70  rest page. Excep
1e800 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67  t, any file larg
1e810 65 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62  er than 0.  ** b
1e820 79 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20  ytes in size is 
1e830 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f  considered to co
1e840 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f  ntain at least o
1e850 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ne page..  */.  
1e860 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1e870 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20    /* Size of db 
1e8a0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
1e8b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
1e8c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1e8d0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1e8e0 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
1e8f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1e900 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ) ){.      int r
1e910 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1e920 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
1e930 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  , &n);.      if(
1e940 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e950 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1e960 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1e970 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28   }.    nPage = (
1e980 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72  Pgno)(n / pPager
1e990 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1e9a0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26   if( nPage==0 &&
1e9b0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 50   n>0 ){.      nP
1e9c0 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  age = 1;.    }. 
1e9d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1e9e0 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
1e9f0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1ea00 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ile is greater t
1ea10 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  han the.  ** con
1ea20 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
1ea30 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
1ea40 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
1ea50 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
1ea60 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
1ea70 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
1ea80 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
1ea90 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1eaa0 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
1eab0 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
1eac0 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20  .  }..  *pnPage 
1ead0 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1eae0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1eaf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1eb00 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68  MIT_WAL./*.** Ch
1eb10 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c  eck if the *-wal
1eb20 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65   file that corre
1eb30 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61  sponds to the da
1eb40 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1eb50 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74   pPager.** exist
1eb60 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  s if the databas
1eb70 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f  e is not empy, o
1eb80 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  r verify that th
1eb90 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
1eba0 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28  s.** not exist (
1ebb0 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20  by deleting it) 
1ebc0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1ebd0 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  file is empty..*
1ebe0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1ebf0 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74  base is not empt
1ec00 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20  y and the *-wal 
1ec10 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65  file exists, ope
1ec20 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69  n the pager.** i
1ec30 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20  n WAL mode.  If 
1ec40 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1ec50 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a  empty or if no *
1ec60 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
1ec70 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72   and.** if no er
1ec80 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  ror occurs, make
1ec90 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
1eca0 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
1ecb0 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a  et to.** PAGER_J
1ecc0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a  OURNALMODE_WAL..
1ecd0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1ece0 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72  ITE_OK or an err
1ecf0 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
1ed00 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68  he caller must h
1ed10 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63  old a SHARED loc
1ed20 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1ed30 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e file to call t
1ed40 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
1ed50 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c   Because an EXCL
1ed60 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1ed70 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71  e db file is req
1ed80 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20  uired to delete 
1ed90 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e  .** a WAL on a n
1eda0 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61  one-empty databa
1edb0 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  se, this ensures
1edc0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
1edd0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  e condition .** 
1ede0 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63  between the xAcc
1edf0 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20  ess() below and 
1ee00 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
1ee10 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
1ee20 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f  ome .** other co
1ee30 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1ee40 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1ee50 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61  nWalIfPresent(Pa
1ee60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1ee70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ee80 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
1ee90 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1eea0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1eeb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1eec0 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1eed0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65   || pPager->noRe
1eee0 61 64 6c 6f 63 6b 20 29 3b 0a 0a 20 20 69 66 28  adlock );..  if(
1eef0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1ef00 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  le ){.    int is
1ef10 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
1ef20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ef30 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73  if WAL file exis
1ef40 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ts */.    Pgno n
1ef50 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1ef60 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1ef70 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ef80 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20  file */..    rc 
1ef90 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
1efa0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
1efb0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1efc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
1efd0 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
1efe0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1eff0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
1f000 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
1f010 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Wal, 0);.      i
1f020 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  sWal = 0;.    }e
1f030 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1f040 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1f050 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1f060 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
1f070 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  >zWal, SQLITE_AC
1f080 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73  CESS_EXISTS, &is
1f090 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Wal.      );.   
1f0a0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1f0b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f0c0 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20    if( isWal ){. 
1f0d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f0e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
1f0f0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
1f100 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
1f110 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f120 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
1f130 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
1f140 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
1f150 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1f160 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1f170 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
1f180 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1f190 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
1f1a0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
1f1b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f1c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f1d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1f1e0 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
1f1f0 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
1f200 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
1f210 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
1f220 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
1f230 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
1f240 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
1f250 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
1f260 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
1f270 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
1f280 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
1f290 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
1f2a0 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
1f2b0 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
1f2c0 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
1f2d0 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
1f2e0 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
1f2f0 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
1f300 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1f310 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
1f320 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
1f330 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
1f340 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
1f350 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
1f360 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
1f370 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
1f380 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
1f390 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
1f3a0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
1f3b0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
1f3c0 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
1f3d0 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
1f3e0 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
1f3f0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
1f400 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
1f410 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
1f420 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
1f430 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1f440 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
1f450 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
1f460 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
1f470 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
1f480 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
1f490 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
1f4a0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
1f4b0 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
1f4c0 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
1f4d0 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
1f4e0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
1f4f0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
1f500 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
1f510 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
1f520 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
1f530 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1f540 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
1f550 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
1f560 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
1f570 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
1f580 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
1f590 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
1f5a0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
1f5b0 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
1f5c0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
1f5d0 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
1f5e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1f5f0 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
1f600 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
1f610 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
1f620 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
1f630 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
1f640 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
1f650 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
1f660 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
1f670 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
1f680 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
1f690 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
1f6a0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
1f6b0 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
1f6c0 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
1f6d0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
1f6e0 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
1f6f0 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
1f700 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
1f710 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
1f720 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
1f730 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
1f740 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
1f750 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
1f760 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
1f770 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
1f780 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
1f790 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
1f7a0 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
1f7b0 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
1f7c0 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
1f7d0 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
1f7e0 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
1f7f0 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
1f800 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
1f810 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
1f820 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
1f830 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
1f840 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
1f850 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1f860 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
1f870 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
1f880 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
1f890 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
1f8a0 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
1f8b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
1f8c0 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
1f8d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1f8e0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
1f8f0 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
1f900 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1f910 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
1f920 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
1f930 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
1f940 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
1f950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1f960 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
1f970 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
1f980 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
1f990 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f9a0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
1f9b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
1f9c0 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
1f9d0 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
1f9e0 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
1f9f0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
1fa00 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
1fa10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1fa20 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
1fa30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1fa40 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1fa50 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
1fa60 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
1fa70 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
1fa80 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
1fa90 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
1faa0 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
1fab0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
1fac0 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
1fad0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
1fae0 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
1faf0 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
1fb00 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
1fb10 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1fb20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1fb30 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61  * Set the databa
1fb40 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20  se size back to 
1fb50 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73  the value it was
1fb60 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65   before the save
1fb70 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e  point .  ** bein
1fb80 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f  g reverted was o
1fb90 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
1fba0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1fbb0 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76  Savepoint ? pSav
1fbc0 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20  epoint->nOrig : 
1fbd0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1fbe0 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  ze;.  pPager->ch
1fbf0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1fc00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1fc10 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
1fc20 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
1fc30 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1fc40 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
1fc50 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
1fc60 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
1fc70 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
1fc80 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
1fc90 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
1fca0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
1fcb0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
1fcc0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
1fcd0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
1fce0 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
1fcf0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
1fd00 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
1fd10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1fd20 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
1fd30 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
1fd40 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
1fd50 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
1fd60 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
1fd70 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
1fd80 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
1fd90 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1fda0 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
1fdb0 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
1fdc0 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
1fdd0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
1fde0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
1fdf0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
1fe00 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
1fe10 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
1fe20 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
1fe30 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
1fe40 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
1fe50 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
1fe60 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
1fe70 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
1fe80 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
1fe90 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
1fea0 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
1feb0 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
1fec0 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
1fed0 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
1fee0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
1fef0 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
1ff00 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
1ff10 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
1ff20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
1ff30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
1ff40 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
1ff50 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1ff60 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
1ff70 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
1ff80 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
1ff90 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
1ffa0 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
1ffb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1ffc0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
1ffd0 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
1ffe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1fff0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20000 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
20010 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
20020 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
20030 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
20040 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
20050 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
20060 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
20070 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
20080 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
20090 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
200a0 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
200b0 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
200c0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
200d0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
200e0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
200f0 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
20100 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
20110 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
20120 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
20130 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
20140 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
20150 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
20160 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
20170 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
20180 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
20190 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
201a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
201b0 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
201c0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
201d0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
201e0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
201f0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
20200 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
20210 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
20220 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
20230 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
20240 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
20250 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
20260 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
20270 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
20280 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
20290 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
202a0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
202b0 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
202c0 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
202d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
202e0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
202f0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
20300 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
20310 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
20320 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
20330 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
20340 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
20350 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
20360 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
20370 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
20380 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
20390 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
203a0 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
203b0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
203c0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
203d0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
203e0 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
203f0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
20400 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
20410 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
20420 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
20430 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
20440 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
20450 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
20460 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
20470 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
20480 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
20490 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
204a0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
204b0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
204c0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
204d0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
204e0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
204f0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
20500 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20510 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
20520 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
20530 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
20540 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
20550 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
20560 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
20570 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
20580 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
20590 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
205a0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
205b0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
205c0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
205d0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
205e0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
205f0 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
20600 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
20610 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
20620 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
20630 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20640 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
20650 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
20660 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
20670 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
20680 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
20690 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
206a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
206b0 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
206c0 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
206d0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
206e0 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
206f0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
20700 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
20710 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
20720 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
20730 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
20740 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
20750 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
20760 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
20770 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20780 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
20790 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
207a0 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
207b0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
207c0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
207d0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
207e0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
207f0 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
20800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20810 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20820 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
20830 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20840 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
20850 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
20860 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
20870 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
20880 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
20890 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
208a0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
208b0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
208c0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
208d0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
208e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
208f0 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
20900 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
20910 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
20920 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
20930 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
20940 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
20950 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
20960 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
20970 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
20980 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
20990 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
209a0 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
209b0 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
209c0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
209d0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
209e0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
209f0 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
20a00 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
20a10 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
20a20 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
20a30 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
20a40 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
20a50 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
20a60 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
20a70 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
20a80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
20a90 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
20aa0 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
20ab0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
20ac0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
20ad0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
20ae0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
20af0 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
20b00 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
20b10 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
20b20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
20b30 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
20b40 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
20b50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20b60 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
20b70 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
20b80 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
20b90 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
20ba0 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
20bb0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
20bc0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
20bd0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
20be0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
20bf0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
20c00 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
20c10 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
20c20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
20c30 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
20c40 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
20c50 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
20c60 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
20c70 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
20c80 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
20c90 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
20cb0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
20cc0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
20cd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20ce0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
20cf0 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
20d00 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
20d10 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
20d20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
20d30 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
20d40 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
20d50 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
20d60 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
20d70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
20d80 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
20d90 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
20da0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
20db0 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61  e above is for a
20dc0 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
20dd0 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c  l mode.  For WAL
20de0 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69   mode, OFF conti
20df0 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20  nues.** to mean 
20e00 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76  that no syncs ev
20e10 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41  er occur.  NORMA
20e20 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
20e30 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a   WAL is synced.*
20e40 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  * prior to the s
20e50 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69  tart of checkpoi
20e60 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  nt and that the 
20e70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
20e80 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68   synced.** at th
20e90 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
20ea0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
20eb0 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  f the entire con
20ec0 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a  tent of the WAL.
20ed0 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62  ** was written b
20ee0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
20ef0 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73  abase.  But no s
20f00 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  ync operations o
20f10 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f  ccur for.** an o
20f20 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69  rdinary commit i
20f30 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69  n NORMAL mode wi
20f40 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65  th WAL.  FULL me
20f50 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
20f60 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63  .** file is sync
20f70 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ed following eac
20f80 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69  h commit operati
20f90 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20  on, in addition 
20fa0 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20  to the.** syncs 
20fb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20fc0 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f  NORMAL..**.** Do
20fd0 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e   not confuse syn
20fe0 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69  chronous=FULL wi
20ff0 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  th SQLITE_SYNC_F
21000 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  ULL.  The.** SQL
21010 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61  ITE_SYNC_FULL ma
21020 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65  cro means to use
21030 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c   the MacOSX-styl
21040 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20  e full-fsync.** 
21050 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55  using fcntl(F_FU
21060 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54  LLFSYNC).  SQLIT
21070 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65  E_SYNC_NORMAL me
21080 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20  ans to do an.** 
21090 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29  ordinary fsync()
210a0 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73   call.  There is
210b0 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
210c0 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59  etween SQLITE_SY
210d0 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53  NC_FULL.** and S
210e0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
210f0 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f  L on platforms o
21100 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58  ther than MacOSX
21110 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79  .  But the.** sy
21120 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76  nchronous=FULL v
21130 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75  ersus synchronou
21140 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67  s=NORMAL setting
21150 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e   determines when
21160 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72  .** the xSync pr
21170 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65  imitive is calle
21180 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e  d and is relevan
21190 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72  t to all platfor
211a0 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ms..**.** Numeri
211b0 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
211c0 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
211d0 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
211e0 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
211f0 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
21200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21210 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
21220 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21230 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
21240 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
21250 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
21260 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61 66  pager to set saf
21270 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f  ety level for */
21280 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20  .  int level,   
21290 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47           /* PRAG
212a0 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 20  MA synchronous. 
212b0 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c   1=OFF, 2=NORMAL
212c0 2c 20 33 3d 46 55 4c 4c 20 2a 2f 20 20 0a 20 20  , 3=FULL */  .  
212d0 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 2c 20  int bFullFsync, 
212e0 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
212f0 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 20 20 69  fullfsync */.  i
21300 6e 74 20 62 43 6b 70 74 46 75 6c 6c 46 73 79 6e  nt bCkptFullFsyn
21310 63 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 63  c    /* PRAGMA c
21320 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73  heckpoint_fullfs
21330 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ync */.){.  asse
21340 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20  rt( level>=1 && 
21350 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50  level<=3 );.  pP
21360 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
21370 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61  (level==1 || pPa
21380 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
21390 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  1:0;.  pPager->f
213a0 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c  ullSync = (level
213b0 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
213c0 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
213d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
213e0 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
213f0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
21400 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  0;.    pPager->c
21410 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30  kptSyncFlags = 0
21420 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 46  ;.  }else if( bF
21430 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20  ullFsync ){.    
21440 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
21450 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
21460 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  FULL;.    pPager
21470 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
21480 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
21490 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LL;.  }else if( 
214a0 62 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63 20 29  bCkptFullFsync )
214b0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
214c0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
214d0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
214e0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
214f0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
21500 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
21510 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
21520 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
21530 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
21540 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
21550 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
21560 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
21570 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
21580 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
21590 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
215a0 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
215b0 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
215c0 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
215d0 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
215e0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
215f0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
21600 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
21610 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
21620 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
21630 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
21640 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
21650 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
21660 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
21670 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
21680 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  file..**.** Writ
21690 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
216a0 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c  iptor into *pFil
216b0 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
216c0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a  _OK on success .
216d0 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
216e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
216f0 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77  e fail. The OS w
21700 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
21710 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  y .** delete the
21720 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
21730 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
21740 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
21750 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  gs passed to the
21760 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e   VFS layer xOpen
21770 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73  () call are thos
21780 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  e specified.** b
21790 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46  y parameter vfsF
217a0 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74  lags ORed with t
217b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
217c0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
217d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a  PEN_READWRITE.**
217e0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
217f0 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53  _CREATE.**     S
21800 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
21810 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  SIVE.**     SQLI
21820 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
21830 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20  CLOSE.*/.static 
21840 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  int pagerOpentem
21850 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  p(.  Pager *pPag
21860 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
21870 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  e pager object *
21880 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
21890 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69   *pFile,  /* Wri
218a0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
218b0 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20  riptor here */. 
218c0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
218d0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
218e0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
218f0 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a  o the VFS */.){.
21900 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
21910 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
21920 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65  n code */..#ifde
21930 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
21940 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
21950 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73  _count++;  /* Us
21960 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
21970 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
21980 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66   */.#endif..  vf
21990 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54  sFlags |=  SQLIT
219a0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
219b0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
219c0 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
219d0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
219e0 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49  EXCLUSIVE | SQLI
219f0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
21a00 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71  CLOSE;.  rc = sq
21a10 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67  lite3OsOpen(pPag
21a20 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69  er->pVfs, 0, pFi
21a30 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29  le, vfsFlags, 0)
21a40 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
21a50 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
21a60 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20  pen(pFile) );.  
21a70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21a80 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
21a90 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
21aa0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  n..**.** The pag
21ab0 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62  er invokes the b
21ac0 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73  usy-handler if s
21ad0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72  qlite3OsLock() r
21ae0 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
21af0 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69  E_BUSY when tryi
21b00 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
21b10 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20  om no-lock to a 
21b20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20  SHARED lock,.** 
21b30 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  or when trying t
21b40 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
21b50 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74   RESERVED lock t
21b60 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  o an EXCLUSIVE .
21b70 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73  ** lock. It does
21b80 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68   *not* invoke th
21b90 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77  e busy handler w
21ba0 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
21bb0 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20  om.** SHARED to 
21bc0 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65  RESERVED, or whe
21bd0 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
21be0 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55   SHARED to EXCLU
21bf0 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f  SIVE.** (which o
21c00 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74  ccurs during hot
21c10 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
21c20 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a  k). Summary:.**.
21c30 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20  **   Transition 
21c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c50 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73         | Invokes
21c60 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a   xBusyHandler.**
21c70 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
21c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
21cb0 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d   NO_LOCK       -
21cc0 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  > SHARED_LOCK   
21cd0 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48     | Yes.**   SH
21ce0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52  ARED_LOCK   -> R
21cf0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20  ESERVED_LOCK    
21d00 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44  | No.**   SHARED
21d10 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55  _LOCK   -> EXCLU
21d20 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f  SIVE_LOCK   | No
21d30 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c  .**   RESERVED_L
21d40 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  OCK -> EXCLUSIVE
21d50 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a  _LOCK   | Yes.**
21d60 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d  .** If the busy-
21d70 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
21d80 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
21d90 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a  o, the lock is .
21da0 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69  ** retried. If i
21db0 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20  t returns zero, 
21dc0 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  then the SQLITE_
21dd0 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a  BUSY error is.**
21de0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
21df0 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70   caller of the p
21e00 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
21e10 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
21e20 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
21e30 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a  ndler(.  Pager *
21e40 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
21e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21e60 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
21e70 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61  .  int (*xBusyHa
21e80 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20  ndler)(void *), 
21e90 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
21ea0 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c  er to busy-handl
21eb0 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  er function */. 
21ec0 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
21ed0 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20  lerArg          
21ee0 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
21ef0 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75  t to pass to xBu
21f00 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20  syHandler */.){ 
21f10 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73   .  pPager->xBus
21f20 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79  yHandler = xBusy
21f30 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65  Handler;.  pPage
21f40 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
21f50 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  rg = pBusyHandle
21f60 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rArg;.}../*.** C
21f70 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
21f80 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
21f90 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
21fa0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
21fb0 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
21fc0 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
21fd0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
21fe0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
21ff0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
22000 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
22010 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
22020 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
22030 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
22040 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
22050 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
22060 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
22070 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f  OERR, an SQLITE_
22080 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f  IOERR_xxx sub-co
22090 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  de or SQLITE_FUL
220a0 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
220b0 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
220c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
220d0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
220e0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
220f0 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
22100 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
22110 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
22120 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
22130 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
22140 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
22150 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
22160 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
22170 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
22180 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
22190 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
221a0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
221b0 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
221c0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
221d0 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
221e0 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
221f0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
22200 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
22210 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
22220 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
22230 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
22240 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
22250 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
22260 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
22270 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
22280 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
22290 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
222a0 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
222b0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
222c0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
222d0 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
222e0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
222f0 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
22300 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
22310 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
22320 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
22330 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
22340 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
22350 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
22360 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
22370 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
22380 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
22390 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
223a0 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
223b0 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
223c0 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
223d0 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
223e0 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
223f0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
22400 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
22410 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
22420 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
22430 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
22440 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
22450 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
22460 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
22470 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
22480 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
22490 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
224a0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
224b0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
224c0 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65  , u32 *pPageSize
224d0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
224e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
224f0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20  TE_OK;..  /* It 
22500 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
22510 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73  to do a full ass
22520 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
22530 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a  ) here, as this.
22540 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61    ** function ma
22550 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  y be called from
22560 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65   within PagerOpe
22570 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20  n(), before the 
22580 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
22590 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e Pager object i
225a0 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e  s internally con
225b0 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  sistent..  **.  
225c0 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  ** At one point 
225d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
225e0 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
225f0 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  if the pager was
22600 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f   in .  ** PAGER_
22610 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74  ERROR state. But
22620 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52   since PAGER_ERR
22630 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74  OR state guarant
22640 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ees that.  ** th
22650 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ere is at least 
22660 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
22670 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20  page reference, 
22680 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
22690 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ** is a no-op fo
226a0 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68  r that case anyh
226b0 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20  ow..  */..  u32 
226c0 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
226d0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
226e0 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
226f0 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
22700 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
22710 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
22720 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  ) );.  if( (pPag
22730 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
22740 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
22750 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  0).   && sqlite3
22760 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
22770 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
22780 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69  =0 .   && pageSi
22790 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
227a0 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
227b0 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  eSize .  ){.    
227c0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c  char *pNew = NUL
227d0 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  L;             /
227e0 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65  * New temp space
227f0 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74   */.    i64 nByt
22800 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
22810 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
22820 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f  AGER_OPEN && isO
22830 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
22840 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22850 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
22860 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79  pPager->fd, &nBy
22870 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  te);.    }.    i
22880 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22890 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
228a0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
228b0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
228c0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
228d0 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c  !pNew ) rc = SQL
228e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
228f0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
22900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22910 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
22920 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
22930 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67  er->dbSize = (Pg
22940 6e 6f 29 28 6e 42 79 74 65 2f 70 61 67 65 53 69  no)(nByte/pageSi
22950 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
22960 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
22970 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  geSize;.      sq
22980 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
22990 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
229a0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
229b0 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
229c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
229d0 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
229e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
229f0 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
22a00 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65   }.  }..  *pPage
22a10 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
22a20 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72  ageSize;.  if( r
22a30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22a40 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65      if( nReserve
22a50 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20  <0 ) nReserve = 
22a60 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
22a70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52  ;.    assert( nR
22a80 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
22a90 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20  serve<1000 );.  
22aa0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72    pPager->nReser
22ab0 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72  ve = (i16)nReser
22ac0 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
22ad0 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
22ae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
22af0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22b00 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
22b10 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
22b20 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
22b30 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
22b40 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
22b50 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
22b60 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
22b70 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
22b80 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
22b90 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
22ba0 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
22bb0 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
22bc0 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
22bd0 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
22be0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
22bf0 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
22c00 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
22c10 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
22c20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
22c30 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
22c40 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
22c50 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
22c60 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
22c70 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
22c80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22c90 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
22ca0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
22cb0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
22cc0 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
22cd0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
22ce0 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
22cf0 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
22d00 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
22d10 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
22d20 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
22d30 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
22d40 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
22d50 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
22d60 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
22d70 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
22d80 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
22d90 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
22da0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
22db0 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
22dc0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
22dd0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
22de0 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
22df0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
22e00 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
22e10 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22e20 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
22e30 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
22e40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
22e50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20  AGER_OPEN );    
22e60 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79    /* Called only
22e70 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   by OP_MaxPgcnt 
22e80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
22e90 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61  ger->mxPgno>=pPa
22ea0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20  ger->dbSize );  
22eb0 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65  /* OP_MaxPgcnt e
22ec0 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a  nforces this */.
22ed0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
22ee0 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
22ef0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
22f00 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
22f10 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
22f20 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
22f30 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
22f40 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
22f50 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
22f60 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
22f70 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
22f80 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
22f90 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
22fa0 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
22fb0 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
22fc0 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
22fd0 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
22fe0 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
22ff0 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
23000 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
23010 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
23020 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
23030 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
23040 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
23050 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
23060 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
23070 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
23080 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
23090 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
230a0 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
230b0 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
230c0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
230d0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
230e0 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
230f0 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
23100 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
23110 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
23120 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
23130 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
23140 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
23150 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
23160 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
23170 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
23180 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
23190 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
231a0 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
231b0 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
231c0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
231d0 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
231e0 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
231f0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
23200 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
23210 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
23220 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28  transient file (
23230 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20  zFilename==""), 
23240 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20  or.** opened on 
23250 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e  a file less than
23260 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   N bytes in size
23270 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  , the output buf
23280 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64  fer is.** zeroed
23290 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
232a0 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74  eturned. The rat
232b0 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20  ionale for this 
232c0 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a  is that this .**
232d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
232e0 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  d to read databa
232f0 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20  se headers, and 
23300 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20  a new transient 
23310 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64  or.** zero sized
23320 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20   database has a 
23330 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73  header than cons
23340 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
23350 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   zeroes..**.** I
23360 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61  f any IO error a
23370 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  part from SQLITE
23380 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
23390 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  D is encountered
233a0 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63  ,.** the error c
233b0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
233c0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e  to the caller an
233d0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
233e0 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
233f0 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64  buffer undefined
23400 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23410 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
23420 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
23430 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
23440 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
23450 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23460 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
23470 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
23480 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
23490 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
234a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
234b0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
234c0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
234d0 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d  led by btree imm
234e0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63  ediately after c
234f0 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
23500 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20   Pager object.  
23510 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65  There has not be
23520 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  en an opportunit
23530 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a  y to transition.
23540 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65    ** to WAL mode
23550 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   yet..  */.  ass
23560 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
23570 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
23580 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
23590 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
235a0 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
235b0 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
235c0 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
235d0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
235e0 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
235f0 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
23600 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
23610 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
23620 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23630 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
23640 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23650 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23660 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
23670 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64  lled when a read
23680 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
23690 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  open on.** the p
236a0 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73  ager. It returns
236b0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
236c0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
236d0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
236e0 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
236f0 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
23700 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
23710 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
23720 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
23730 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
23740 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f   1 page file..*/
23750 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
23760 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
23770 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
23780 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  pnPage){.  asser
23790 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
237a0 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
237b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
237c0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
237d0 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
237e0 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20  ED );.  *pnPage 
237f0 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64  = (int)pPager->d
23800 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  bSize;.}.../*.**
23810 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
23820 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
23830 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
23840 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
23850 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
23860 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
23870 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
23880 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
23890 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
238a0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
238b0 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
238c0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
238d0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
238e0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
238f0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
23900 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
23910 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
23920 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
23930 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
23940 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
23950 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
23960 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
23970 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
23980 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
23990 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
239a0 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
239b0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
239c0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
239d0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
239e0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
239f0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
23a00 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
23a10 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
23a20 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
23a30 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
23a40 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
23a50 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
23a60 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
23a70 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
23a80 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
23a90 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
23aa0 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23ad0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
23ae0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
23af0 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
23b00 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
23b10 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
23b20 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
23b30 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20  dy held, or one 
23b40 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69  of the transisti
23b50 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
23b60 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
23b70 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
23b80 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
23b90 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
23ba0 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
23bb0 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
23bc0 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
23bd0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
23be0 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29  eLock>=locktype)
23bf0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
23c00 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
23c10 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
23c20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
23c30 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
23c40 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
23c50 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
23c60 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
23c70 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  ).  );..  do {. 
23c80 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
23c90 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b  kDb(pPager, lock
23ca0 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
23cb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
23cc0 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
23cd0 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
23ce0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
23cf0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
23d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
23d10 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61  ion assertTrunca
23d20 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
23d30 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74  ger) checks that
23d40 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
23d50 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
23d60 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20  e for all dirty 
23d70 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
23d80 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
23d90 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68  e:.**.**   a) Th
23da0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
23db0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
23dc0 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
23dd0 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
23de0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
23df0 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73   image, in pages
23e00 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  , OR.**.**   b) 
23e10 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  if the page cont
23e20 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e  ent were written
23e30 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69   at this time, i
23e40 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20  t would not.**  
23e50 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79      be necessary
23e60 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
23e70 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75  rrent content ou
23e80 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  t to the sub-jou
23e90 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73  rnal.**      (as
23ea0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66   determined by f
23eb0 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75  unction subjRequ
23ec0 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a  iresPage())..**.
23ed0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74  ** If the condit
23ee0 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20  ion asserted by 
23ef0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65  this function we
23f00 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
23f10 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
23f20 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69  ge were to be di
23f30 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65  scarded from the
23f40 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70   cache via the p
23f50 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
23f60 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74  routine, pagerSt
23f70 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74  ress() would not
23f80 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
23f90 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
23fa0 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
23fb0 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61  se file. If a sa
23fc0 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
23fd0 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20  ion were rolled 
23fe0 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68  back after.** th
23ff0 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65  is happened, the
24000 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
24010 75 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72  ur would be to r
24020 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
24030 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  nt.** content of
24040 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76   the page. Howev
24050 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63  er, since this c
24060 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72  ontent is not pr
24070 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a  esent in either.
24080 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
24090 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74  file or the port
240a0 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ion of the rollb
240b0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
240c0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
240d0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
240e0 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f  content could no
240f0 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  t be restored an
24100 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
24110 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65  e image would be
24120 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74  come corrupt. It
24130 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f   is therefore fo
24140 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a  rtunate that .**
24150 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e   this circumstan
24160 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e  ce cannot arise.
24170 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
24180 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
24190 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
241a0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
241b0 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29  ntCb(PgHdr *pPg)
241c0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
241d0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
241e0 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TY );.  assert( 
241f0 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
24200 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  e(pPg) || pPg->p
24210 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72  gno<=pPg->pPager
24220 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74  ->dbSize );.}.st
24230 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
24240 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
24250 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
24260 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
24270 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
24280 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
24290 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
242a0 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23  nstraintCb);.}.#
242b0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73  else.# define as
242c0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
242d0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23  traint(pPager).#
242e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  endif../*.** Tru
242f0 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ncate the in-mem
24300 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ory database fil
24310 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65  e image to nPage
24320 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a   pages. This .**
24330 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
24340 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
24350 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
24360 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74  file on disk. It
24370 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74   .** just sets t
24380 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
24390 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  e of the pager o
243a0 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68  bject so that th
243b0 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e  e .** truncation
243c0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68   will be done wh
243d0 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  en the current t
243e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
243f0 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  mmitted..*/.void
24400 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
24410 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72  ncateImage(Pager
24420 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
24430 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
24440 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
24450 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  =nPage );.  asse
24460 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
24470 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
24480 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70  _CACHEMOD );.  p
24490 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
244a0 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54  nPage;.  assertT
244b0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
244c0 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f  t(pPager);.}.../
244d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
244e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
244f0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
24500 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
24510 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e  lback. It.** syn
24520 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  cs the journal f
24530 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65  ile to disk, the
24540 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a  n sets pPager->j
24550 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65  ournalHdr to the
24560 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
24570 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20  journal file so 
24580 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70  that the pager_p
24590 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
245a0 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20  e knows.** that 
245b0 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
245c0 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
245d0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53   synced..**.** S
245e0 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  yncing a hot-jou
245f0 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66  rnal to disk bef
24600 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
24610 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65  o roll it back e
24620 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20  nsures .** that 
24630 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75  if a power-failu
24640 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  re occurs during
24650 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74   the rollback, t
24660 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a  he process that.
24670 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c  ** attempts roll
24680 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73  back following s
24690 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73  ystem recovery s
246a0 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75  ees the same jou
246b0 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rnal.** content 
246c0 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  as this process.
246d0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
246e0 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61  hing goes as pla
246f0 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  nned, SQLITE_OK 
24700 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
24710 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53  erwise, .** an S
24720 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
24730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24740 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
24750 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
24760 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
24770 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
24780 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
24790 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
247a0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
247b0 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
247c0 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a  NC_NORMAL);.  }.
247d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
247e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
247f0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
24800 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
24810 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
24820 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dr);.  }.  retur
24830 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
24840 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
24850 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
24860 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
24870 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
24880 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
24890 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
248a0 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
248b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
248c0 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
248d0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
248e0 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
248f0 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
24900 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
24910 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
24920 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
24930 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
24940 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
24950 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
24960 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
24970 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
24980 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
24990 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
249a0 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
249b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
249c0 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
249d0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
249e0 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
249f0 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
24a00 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
24a10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
24a20 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
24a30 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
24a40 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
24a50 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
24a60 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
24a70 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
24a80 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
24a90 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
24aa0 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
24ab0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38  r *pPager){.  u8
24ac0 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70   *pTmp = (u8 *)p
24ad0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
24ae0 3b 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  ;..  disable_sim
24af0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24b00 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
24b10 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
24b20 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
24b30 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20  rrCode = 0; */. 
24b40 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
24b50 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e  veMode = 0;.#ifn
24b60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24b70 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  WAL.  sqlite3Wal
24b80 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57  Close(pPager->pW
24b90 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  al, pPager->ckpt
24ba0 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65  SyncFlags, pPage
24bb0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d  r->pageSize, pTm
24bc0 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57  p);.  pPager->pW
24bd0 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  al = 0;.#endif. 
24be0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
24bf0 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  ger);.  if( MEMD
24c00 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75  B ){.    pager_u
24c10 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
24c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
24c30 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79  f it is open, sy
24c40 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
24c50 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
24c60 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  ng UnlockAndRoll
24c70 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20  back..    ** If 
24c80 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65  this is not done
24c90 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63  , then an unsync
24ca0 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
24cb0 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a  e open journal .
24cc0 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20      ** file may 
24cd0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  be played back i
24ce0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
24cf0 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69  . If a power fai
24d00 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20  lure occurs .   
24d10 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69   ** while this i
24d20 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65  s happening, the
24d30 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
24d40 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a  become corrupt..
24d50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
24d60 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
24d70 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
24d80 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
24d90 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67  l, shift the pag
24da0 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  er.    ** into t
24db0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  he ERROR state. 
24dc0 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f  This causes Unlo
24dd0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f  ckAndRollback to
24de0 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20   unlock the.    
24df0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ** database and 
24e00 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
24e10 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  l file without a
24e20 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c  ttempting to rol
24e30 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b  l it.    ** back
24e40 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e   or finalize it.
24e50 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61   The next databa
24e60 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76  se user will hav
24e70 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72  e to do hot-jour
24e80 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  nal.    ** rollb
24e90 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73  ack before acces
24ea0 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  sing the databas
24eb0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
24ec0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
24ed0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
24ee0 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
24ef0 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e  pPager, pagerSyn
24f00 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
24f10 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
24f20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
24f30 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
24f40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64    }.  sqlite3End
24f50 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
24f60 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
24f70 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
24f80 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
24f90 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
24fa0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
24fb0 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
24fc0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
24fd0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
24fe0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
24ff0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
25000 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
25010 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
25020 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  pTmp);.  sqlite3
25030 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67  PcacheClose(pPag
25040 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23  er->pPCache);..#
25050 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
25060 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61  _CODEC.  if( pPa
25070 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
25080 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ) pPager->xCodec
25090 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f  Free(pPager->pCo
250a0 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  dec);.#endif..  
250b0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
250c0 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21  >aSavepoint && !
250d0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
250e0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
250f0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
25100 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28  jfd) && !isOpen(
25110 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b  pPager->sjfd) );
25120 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
25130 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
25140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25150 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
25160 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
25170 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
25180 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
25190 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
251a0 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f  age pPg..*/.Pgno
251b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
251c0 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
251d0 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
251e0 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64  Pg->pgno;.}.#end
251f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
25200 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
25210 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65  e count for page
25220 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   pPg..*/.void sq
25230 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
25240 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71  Page *pPg){.  sq
25250 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70  lite3PcacheRef(p
25260 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  Pg);.}../*.** Sy
25270 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
25280 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
25290 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
252a0 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
252b0 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
252c0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
252d0 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
252e0 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
252f0 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
25300 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73  k and can be res
25310 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  tored in the eve
25320 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  nt of a hot-jour
25330 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  nal rollback..**
25340 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72  .** If the Pager
25350 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20  .noSync flag is 
25360 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  set, then this f
25370 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
25380 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
25390 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65  , the actions re
253a0 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e  quired depend on
253b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
253c0 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65  e and the .** de
253d0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
253e0 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20  tics of the the 
253f0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20  file-system, as 
25400 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
25410 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
25420 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d  l file is an in-
25430 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
25440 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e  ile, no action n
25450 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61  eed.**     be ta
25460 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f  ken..**.**   * O
25470 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
25480 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
25490 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46   support the SAF
254a0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
254b0 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74  y,.**     then t
254c0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
254d0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
254e0 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
254f0 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  al header.**    
25500 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63   is updated to c
25510 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
25520 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63  r of journal rec
25530 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ords that have.*
25540 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74  *     been writt
25550 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  en following it.
25560 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
25570 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75   operating in fu
25580 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d  ll-sync.**     m
25590 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
255a0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
255b0 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nced before this
255c0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
255d0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  d..**.**   * If 
255e0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
255f0 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
25600 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65  SEQUENTIAL prope
25610 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20  rty, then .**   
25620 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
25630 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
25640 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f  Or, in pseudo-co
25650 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  de:.**.**   if( 
25660 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a  NOT <in-memory j
25670 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20  ournal> ){.**   
25680 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41    if( NOT SAFE_A
25690 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20  PPEND ){.**     
256a0 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63    if( <full-sync
256b0 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c   mode> ) xSync(<
256c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
256d0 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65  **       <update
256e0 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20   nRec field>.** 
256f0 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66      } .**     if
25700 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c  ( NOT SEQUENTIAL
25710 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
25720 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d  l file>);.**   }
25730 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
25740 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  sful, this routi
25750 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47  ne clears the PG
25760 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
25770 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20  ag of every .** 
25780 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68  page currently h
25790 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65  eld in memory be
257a0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
257b0 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
257c0 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65  IO.** error is e
257d0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
257e0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
257f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
25800 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
25810 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
25820 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
25830 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64  Pager, int newHd
25840 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
25850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25860 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
25870 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
25880 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
25890 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
258a0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
258b0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
258c0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
258d0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
258e0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
258f0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
25900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  );.  assert( !pa
25910 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
25920 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ) );..  rc = sql
25930 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
25940 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  veLock(pPager);.
25950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25960 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
25970 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
25980 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
25990 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
259a0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
259b0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
259c0 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
259d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
259e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
259f0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
25a00 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20    const int iDc 
25a10 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
25a20 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
25a30 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
25a40 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
25a50 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
25a60 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
25a70 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
25a80 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
25a90 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
25aa0 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  is block deals w
25ab0 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70  ith an obscure p
25ac0 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c  roblem. If the l
25ad0 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  ast connection. 
25ae0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
25af0 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74  rote to this dat
25b00 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74  abase was operat
25b10 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e  ing in persisten
25b20 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t-journal.      
25b30 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
25b40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25b50 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69   may at this poi
25b60 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c  nt actually be l
25b70 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  arger.        **
25b80 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72   than Pager.jour
25b90 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66  nalOff bytes. If
25ba0 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20   the next thing 
25bb0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  in the journal. 
25bc0 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68         ** file h
25bd0 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a  appens to be a j
25be0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77  ournal-header (w
25bf0 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f  ritten as part o
25c00 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
25c10 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63   previous connec
25c20 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69  tion's transacti
25c30 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68  on), and a crash
25c40 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72   or power-failur
25c50 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63  e .        ** oc
25c60 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20  curs after nRec 
25c70 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62  is updated but b
25c80 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65  efore this conne
25c90 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20  ction writes .  
25ca0 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e        ** anythin
25cb0 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f  g else to the jo
25cc0 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63  urnal file (or c
25cd0 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63  ommits/rolls bac
25ce0 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a  k its .        *
25cf0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  * transaction), 
25d00 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20  then SQLite may 
25d10 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20  become confused 
25d20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a  when doing the .
25d30 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a          ** hot-j
25d40 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
25d50 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65  following recove
25d60 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20  ry. It may roll 
25d70 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20  back all.       
25d80 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   ** of this conn
25d90 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68  ections data, th
25da0 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f  en proceed to ro
25db0 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f  lling back the o
25dc0 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ld,.        ** o
25dd0 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20  ut-of-date data 
25de0 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e  that follows it.
25df0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
25e00 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
25e10 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77  .        ** To w
25e20 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c  ork around this,
25e30 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
25e40 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72  file does appear
25e50 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20   to contain.    
25e60 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68      ** a valid h
25e70 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  eader following 
25e80 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
25e90 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30  , then write a 0
25ea0 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  x00.        ** b
25eb0 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74  yte to the start
25ec0 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e   of it to preven
25ed0 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20  t it from being 
25ee0 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20  recognized..    
25ef0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
25f00 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74  * Variable iNext
25f10 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
25f20 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61   to the offset a
25f30 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20  t which this.   
25f40 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61       ** problema
25f50 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20  tic header will 
25f60 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69  occur, if it exi
25f70 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75  sts. aMagic is u
25f80 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  sed .        ** 
25f90 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  as a temporary b
25fa0 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74  uffer to inspect
25fb0 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c   the first coupl
25fc0 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20  e of bytes of.  
25fd0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74        ** the pot
25fe0 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68  ential journal h
25ff0 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  eader..        *
26000 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e  /.        i64 iN
26010 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20  extHdrOffset;.  
26020 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b        u8 aMagic[
26030 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a  8];.        u8 z
26040 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
26050 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b  ournalMagic)+4];
26060 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ..        memcpy
26070 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
26080 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
26090 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
260a0 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
260b0 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
260c0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
260d0 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  )], pPager->nRec
260e0 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78  );..        iNex
260f0 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75  tHdrOffset = jou
26100 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
26110 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ager);.        r
26120 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
26130 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
26140 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48  Magic, 8, iNextH
26150 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
26160 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26170 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  E_OK && 0==memcm
26180 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
26190 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20  alMagic, 8) ){. 
261a0 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
261b0 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74  const u8 zerobyt
261c0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
261d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
261e0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
261f0 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20  , &zerobyte, 1, 
26200 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
26210 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26220 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26230 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
26240 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
26250 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
26260 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26270 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
26280 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
26290 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
262a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
262b0 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
262c0 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
262d0 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
262e0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
262f0 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
26300 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
26310 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
26320 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
26330 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
26340 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
26350 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
26360 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
26370 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
26380 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
26390 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
263a0 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
263b0 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
263c0 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
263d0 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
263e0 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
263f0 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
26400 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
26410 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
26420 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
26430 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
26440 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
26450 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
26460 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
26470 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
26480 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
26490 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
264a0 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
264b0 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
264c0 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
264d0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
264e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
264f0 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
26500 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
26510 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
26520 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
26530 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
26540 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
26550 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
26560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
26570 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
26580 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
26590 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
265a0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
265b0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
265c0 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  yncFlags);.     
265d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
265e0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
265f0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
26600 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
26610 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  JHDR %p %lld\n",
26620 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
26630 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20  >journalHdr));. 
26640 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26650 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20  te3OsWrite(.    
26660 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
26670 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
26680 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70  zeof(zHeader), p
26690 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
266a0 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
266b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
266c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
266d0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
266e0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
266f0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
26700 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
26710 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
26720 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
26730 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
26740 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
26750 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
26760 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
26770 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
26780 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
26790 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
267a0 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20  >syncFlags| .   
267b0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
267c0 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54  syncFlags==SQLIT
267d0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
267e0 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
267f0 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
26800 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26810 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
26820 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
26830 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
26840 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
26850 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
26860 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26      if( newHdr &
26870 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
26880 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
26890 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ND) ){.        p
268a0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
268b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
268c0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
268d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
268e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
268f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
26900 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
26910 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
26920 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
26930 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
26940 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
26950 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
26960 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f   is in noSync mo
26970 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
26980 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20  file was just . 
26990 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79   ** successfully
269a0 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20   synced. Either 
269b0 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50  way, clear the P
269c0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
269d0 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c  lag on .  ** all
269e0 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73   pages..  */.  s
269f0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
26a00 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65  rSyncFlags(pPage
26a10 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70  r->pPCache);.  p
26a20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
26a30 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
26a40 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73  OD;.  assert( as
26a50 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
26a60 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
26a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26a80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
26a90 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
26aa0 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
26ab0 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
26ac0 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
26ad0 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
26ae0 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
26af0 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
26b00 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
26b10 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
26b20 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
26b30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
26b40 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
26b50 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
26b60 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
26b70 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
26b80 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
26b90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
26ba0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
26bb0 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
26bc0 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
26bd0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
26be0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
26bf0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
26c00 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
26c10 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
26c20 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
26c30 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
26c40 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
26c50 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
26c60 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
26c70 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
26c80 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
26c90 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
26ca0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
26cb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26cc0 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
26cd0 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
26ce0 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
26cf0 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
26d00 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
26d10 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
26d20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
26d30 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
26d40 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
26d50 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
26d60 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
26d70 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
26d80 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
26d90 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
26da0 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
26db0 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
26dc0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
26dd0 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
26de0 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
26df0 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
26e00 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
26e10 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
26e20 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
26e30 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
26e40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
26e50 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
26e60 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
26e70 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
26e80 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
26e90 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
26ea0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
26eb0 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
26ec0 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
26ed0 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
26ee0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
26ef0 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
26f00 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
26f10 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
26f20 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
26f30 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
26f40 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
26f50 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
26f60 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
26f70 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
26f80 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
26f90 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
26fa0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
26fb0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
26fc0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
26fd0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
26fe0 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
26ff0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
27000 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
27010 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
27020 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
27030 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
27040 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
27050 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
27060 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
27070 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70  agelist(Pager *p
27080 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c  Pager, PgHdr *pL
27090 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ist){.  int rc =
270a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
270c0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
270d0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
270e0 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
270f0 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70  d for rollback p
27100 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f  agers in WRITER_
27110 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a  DBMOD state. */.
27120 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
27130 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
27140 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27150 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
27160 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
27170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27180 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
27190 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
271a0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
271b0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61  s a temp-file ha
271c0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
271d0 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
271e0 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e  ow. It.  ** is n
271f0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
27200 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74  rc to be other t
27210 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
27220 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
27230 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70  * is taken, as p
27240 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
27250 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
27260 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20  or temp-files.. 
27270 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
27280 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
27290 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
272a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
272b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
272c0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
272d0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
272e0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
272f0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
27300 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
27310 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65   the first write
27320 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61  , give the VFS a
27330 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68   hint of what th
27340 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  e final.  ** fil
27350 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a  e size will be..
27360 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72    */.  assert( r
27370 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
27380 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
27390 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  d) );.  if( rc==
273a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
273b0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 70 50 61 67  ger->dbSize>pPag
273c0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
273d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
273e0 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61  t64 szFile = pPa
273f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20  ger->pageSize * 
27400 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
27410 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
27420 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
27430 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
27440 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
27450 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46  _SIZE_HINT, &szF
27460 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ile);.    pPager
27470 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
27480 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
27490 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
274a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
274b0 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
274c0 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
274d0 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
274e0 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
274f0 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
27500 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
27510 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
27520 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
27530 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
27540 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
27550 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
27560 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
27570 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
27580 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
27590 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
275a0 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
275b0 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
275c0 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
275d0 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
275e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
275f0 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
27600 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
27610 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
27620 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
27630 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
27640 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
27650 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
27660 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
27670 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
27680 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
27690 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
276a0 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
276b0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
276c0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
276d0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
276e0 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
276f0 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
27700 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
27730 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
27740 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   ..      assert(
27750 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50   (pList->flags&P
27760 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
27770 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
27780 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
27790 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
277a0 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
277b0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63  );..      /* Enc
277c0 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
277d0 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
277e0 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
277f0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
27800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27810 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  MEM, pData);..  
27820 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
27830 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
27840 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
27850 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
27860 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
27870 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
27880 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
27890 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
278a0 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
278b0 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
278c0 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
278d0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
278e0 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
278f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
27900 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
27910 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
27920 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
27930 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
27940 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
27950 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
27960 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
27970 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
27980 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
27990 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
279a0 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
279b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
279c0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
279d0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
279e0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
279f0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
27a00 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
27a10 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pgno;.      }.. 
27a20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
27a30 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
27a40 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
27a50 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
27a60 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
27a70 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
27a80 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
27a90 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70  up, pgno, (u8*)p
27aa0 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20  List->pData);.. 
27ab0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
27ac0 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
27ad0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
27ae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27af0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
27b00 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
27b10 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
27b20 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  )));.      IOTRA
27b30 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
27b40 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
27b50 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
27b60 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
27b70 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
27b80 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
27b90 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
27ba0 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ite);.    }else{
27bb0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
27bc0 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E(("NOSTORE %d p
27bd0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
27be0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
27bf0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
27c00 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
27c10 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69  (pList);.    pLi
27c20 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
27c30 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
27c40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
27c50 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
27c60 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
27c70 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69  is open. If it i
27c80 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
27c90 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
27ca0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
27cb0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
27cc0 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
27cd0 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
27ce0 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
27cf0 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  An .** SQLITE_IO
27d00 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
27d10 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
27d20 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  f a call to sqli
27d30 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20  te3OsOpen() .** 
27d40 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
27d50 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
27d60 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
27d70 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
27d80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
27d90 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
27da0 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  sjfd) ){.    if(
27db0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27dc0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
27dd0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
27de0 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
27df0 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
27e00 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
27e10 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  lOpen(pPager->sj
27e20 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
27e30 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
27e40 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
27e50 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
27e60 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
27e70 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
27e80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27e90 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
27ea0 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
27eb0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
27ec0 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
27ed0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
27ee0 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
27ef0 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
27f00 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
27f10 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
27f20 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
27f30 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
27f40 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
27f50 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
27f60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
27f70 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
27f80 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
27f90 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
27fa0 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
27fb0 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
27fc0 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
27fd0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
27fe0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
27ff0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
28000 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
28010 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
28020 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
28030 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
28040 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
28050 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
28060 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
28070 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
28080 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
28090 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
280a0 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
280b0 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
280c0 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
280d0 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
280e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
280f0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
28100 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
28110 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ager;.  if( pPag
28120 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
28130 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
28140 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f  DE_OFF ){..    /
28150 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
28160 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61  ournal, if it ha
28170 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
28180 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20  en opened */.   
28190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
281a0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
281b0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
281c0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
281d0 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
281e0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73  ager) );.    ass
281f0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
28200 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61  er->sjfd) || pPa
28210 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20  ger->nSubRec==0 
28220 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
28230 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
28240 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  r) .         || 
28250 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
28260 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  g) .         || 
28270 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
28280 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
28290 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70    );.    rc = op
282a0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
282b0 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
282c0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
282d0 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63   was opened succ
282e0 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73  essfully (or was
282f0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a   already open),.
28300 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65      ** write the
28310 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
28320 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
28330 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
28340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28350 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
28360 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
28370 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
28380 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28  Pager->nSubRec*(
28390 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
283a0 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ze);.      char 
283b0 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20  *pData2;.  .    
283c0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
283d0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
283e0 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
283f0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
28400 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  2);.      PAGERT
28410 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE(("STMT-JOUR
28420 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
28430 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28440 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
28450 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
28460 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
28470 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  sjfd, offset, pP
28480 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
28490 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
284a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
284b0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
284c0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70  (pPager->sjfd, p
284d0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
284e0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
284f0 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
28500 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
28510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28520 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
28530 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
28540 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
28550 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  nt>0 );.    rc =
28560 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
28570 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
28580 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
28590 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
285a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
285b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
285c0 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
285d0 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
285e0 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
285f0 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
28600 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
28610 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
28620 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63  to a Pager objec
28630 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20  t.** (cast as a 
28640 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65  void*). The page
28650 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72  r is always 'pur
28660 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20  geable' (not an 
28670 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
28680 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f  abase). The seco
28690 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
286a0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
286b0 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a  page that is .**
286c0 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
286d0 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73   but has no outs
286e0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
286f0 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20  es. The page.** 
28700 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69  is always associ
28710 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61  ated with the Pa
28720 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
28730 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a  d as the first .
28740 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
28750 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
28760 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
28770 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e  o make pPg clean
28780 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20   by writing its 
28790 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20  contents.** out 
287a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
287b0 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  file, if possibl
287c0 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f  e. This may invo
287d0 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a  lve syncing the.
287e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
287f0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
28800 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63  ssful, sqlite3Pc
28810 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
28820 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
28830 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c   page and.** SQL
28840 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
28850 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
28860 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
28870 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ing to make the.
28880 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74  ** page clean, t
28890 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
288a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
288b0 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74   the page cannot
288c0 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61   be.** made clea
288d0 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  n for some other
288e0 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20   reason, but no 
288f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
28900 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  en SQLITE_OK.** 
28910 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  is returned by s
28920 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
28930 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63  Clean() is not c
28940 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
28950 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
28960 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20  (void *p, PgHdr 
28970 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
28980 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
28990 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *)p;.  int rc = 
289a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
289b0 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
289c0 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
289d0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
289e0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
289f0 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74  ..  /* The doNot
28a00 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 69  SyncSpill flag i
28a10 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d  s set during tim
28a20 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  es when doing a 
28a30 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75  sync of.  ** jou
28a40 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67  rnal (and adding
28a50 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69   a new header) i
28a60 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20  s not allowed.  
28a70 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a  This occurs.  **
28a80 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f   during calls to
28a90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28aa0 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e  te() while tryin
28ab0 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c  g to journal mul
28ac0 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73  tiple.  ** pages
28ad0 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68   belonging to th
28ae0 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20  e same sector.. 
28af0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e   **.  ** The doN
28b00 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68  otSpill flag inh
28b10 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20  ibits all cache 
28b20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c  spilling regardl
28b30 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 0a 20  ess of whether. 
28b40 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e   ** or not a syn
28b50 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  c is required.  
28b60 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69  This is set duri
28b70 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20  ng a rollback.. 
28b80 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e   **.  ** Spillin
28b90 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62  g is also prohib
28ba0 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20  ited when in an 
28bb0 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63  error state sinc
28bc0 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a  e that could.  *
28bd0 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  * lead to databa
28be0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
28bf0 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
28c00 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69 74  implementaton it
28c10 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73   .  ** is imposs
28c20 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ible for sqlite3
28c30 50 43 61 63 68 65 46 65 74 63 68 28 29 20 74 6f  PCacheFetch() to
28c40 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
28c50 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20 20  createFlag==1.  
28c60 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  ** while in the 
28c70 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e  error state, hen
28c80 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  ce it is impossi
28c90 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
28ca0 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20  tine to.  ** be 
28cb0 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72  called in the er
28cc0 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65  ror state.  Neve
28cd0 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63  rtheless, we inc
28ce0 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20  lude a NEVER(). 
28cf0 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65   ** test for the
28d00 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20   error state as 
28d10 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69  a safeguard agai
28d20 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67  nst future chang
28d30 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  es..  */.  if( N
28d40 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
28d50 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53  Code) ) return S
28d60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
28d70 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
28d80 6c 6c 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ll ) return SQLI
28d90 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
28da0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
28db0 69 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c 61  ill && (pPg->fla
28dc0 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f  gs & PGHDR_NEED_
28dd0 53 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20 20  SYNC)!=0 ){.    
28de0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28df0 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
28e00 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
28e10 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
28e20 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72  er) ){.    /* Wr
28e30 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ite a single fra
28e40 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  me for this page
28e50 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a   to the log. */.
28e60 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75      if( subjRequ
28e70 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
28e80 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62   .      rc = sub
28e90 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
28ea0 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ; .    }.    if(
28eb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28ec0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
28ed0 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
28ee0 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 2c 20 30  er, pPg, 0, 0, 0
28ef0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
28f00 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63  {.  .    /* Sync
28f10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28f20 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  e if required. *
28f30 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66  /.    if( pPg->f
28f40 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
28f50 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50  SYNC .     || pP
28f60 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
28f70 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
28f80 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  MOD.    ){.     
28f90 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
28fa0 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  l(pPager, 1);.  
28fb0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
28fc0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
28fd0 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73   of this page is
28fe0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
28ff0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
29000 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
29010 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d  base image, it m
29020 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72  ay need to be wr
29030 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
29040 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a  -journal..    **
29050 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
29060 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67   the call to pag
29070 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
29080 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  t() below will n
29090 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  ot.    ** actual
290a0 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74 6f  ly write data to
290b0 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69   the file in thi
290c0 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20  s case..    **. 
290d0 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74     ** Consider t
290e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71  he following seq
290f0 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a  uence of events:
29100 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
29110 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20   BEGIN;.    **  
29120 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
29130 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c   X>.    **     <
29140 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20  modify page X>. 
29150 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f     **     SAVEPO
29160 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20  INT sp;.    **  
29170 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74       <shrink dat
29180 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20  abase file to Y 
29190 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20  pages>.    **   
291a0 20 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28      pagerStress(
291b0 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20  page X).    **  
291c0 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73     ROLLBACK TO s
291d0 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  p;.    **.    **
291e0 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20   If (X>Y), then 
291f0 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73  when pagerStress
29200 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20   is called page 
29210 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  X will not be wr
29220 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74  itten.    ** out
29230 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29240 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20   file, but will 
29250 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
29260 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c  the cache. Then,
29270 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
29280 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  g the "ROLLBACK 
29290 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74  TO sp" statement
292a0 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58  , reading page X
292b0 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a   will read.    *
292c0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
292d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
292e0 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
292f0 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20 61  copy of page X a
29300 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20  s it.    ** was 
29310 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
29320 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f  tion started, no
29330 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
29340 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a   "SAVEPOINT sp".
29350 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75      ** was execu
29360 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
29370 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
29380 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  is to write the 
29390 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72  current data for
293a0 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65   page X into the
293b0 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75   .    ** sub-jou
293c0 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69  rnal file now (i
293d0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
293e0 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74  ady there), so t
293f0 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20  hat it will.    
29400 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ** be restored t
29410 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  o its current va
29420 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f  lue when the "RO
29430 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73  LLBACK TO sp" is
29440 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65   .    ** execute
29450 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
29460 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20  ( NEVER(.       
29470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29480 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  & pPg->pgno>pPag
29490 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75  er->dbSize && su
294a0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
294b0 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20  Pg).    ) ){.   
294c0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
294d0 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
294e0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69   }.  .    /* Wri
294f0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
29500 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  of the page out 
29510 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
29520 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
29530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29540 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
29550 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
29560 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
29570 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
29580 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
29590 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  st(pPager, pPg);
295a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
295b0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
295c0 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66  s clean. */.  if
295d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
295e0 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
295f0 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61  E(("STRESS %d pa
29600 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
29610 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
29620 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  pgno));.    sqli
29630 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
29640 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  an(pPg);.  }..  
29650 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
29660 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20  or(pPager, rc); 
29670 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
29680 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
29690 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
296a0 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
296b0 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
296c0 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
296d0 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
296e0 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
296f0 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
29700 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
29710 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
29720 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
29730 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
29740 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
29750 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
29760 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
29770 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
29780 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
29790 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
297a0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
297b0 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
297c0 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
297d0 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
297e0 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
297f0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
29800 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
29810 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
29820 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
29830 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
29840 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
29850 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
29860 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
29870 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
29880 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
29890 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
298a0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
298b0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
298c0 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
298d0 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
298e0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
298f0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
29900 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
29910 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
29920 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
29930 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
29940 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
29950 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
29960 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
29970 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
29980 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
29990 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
299a0 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
299b0 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
299c0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
299d0 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
299e0 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
299f0 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
29a00 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54  f the PAGER_OMIT
29a10 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47  _JOURNAL and PAG
29a20 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66  ER_NO_READLOCK f
29a30 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
29a40 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
29a50 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
29a60 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
29a70 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
29a80 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
29a90 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
29aa0 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
29ab0 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
29ac0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
29ad0 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
29ae0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
29af0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
29b00 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
29b10 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
29b20 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
29b30 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
29b40 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
29b50 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
29b60 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
29b70 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
29b80 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
29b90 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
29ba0 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
29bb0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
29bc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
29bd0 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
29be0 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
29bf0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
29c00 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
29c10 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
29c20 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
29c30 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
29c40 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
29c50 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
29c60 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
29c70 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
29c80 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
29c90 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
29ca0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
29cb0 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
29cc0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
29cd0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
29ce0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
29cf0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
29d00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
29d10 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
29d20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
29d30 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
29d40 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
29d50 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
29d60 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
29d70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29d80 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
29d90 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
29da0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
29db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29dc0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
29dd0 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
29de0 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
29df0 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
29e00 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
29e10 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
29e20 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
29e30 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
29e40 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
29e50 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
29e60 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
29e70 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
29e80 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
29e90 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
29ea0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
29eb0 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
29ec0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
29ed0 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
29ee0 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
29ef0 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
29f00 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
29f10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
29f20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
29f30 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
29f40 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
29f50 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
29f60 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
29f70 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
29f80 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
29f90 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
29fa0 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
29fb0 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
29fc0 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
29fd0 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
29fe0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
29ff0 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
2a000 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
2a010 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
2a020 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2a030 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
2a040 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
2a050 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
2a060 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
2a070 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
2a080 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
2a090 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  */.  int noReadl
2a0a0 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
2a0b0 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
2a0c0 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  )!=0;  /* True t
2a0d0 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b  o omit read-lock
2a0e0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
2a0f0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
2a100 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
2a110 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2a120 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
2a130 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67  e */.  u32 szPag
2a140 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
2a150 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2a160 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
2a170 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a  ge size */..  /*
2a180 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
2a190 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
2a1a0 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
2a1b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
2a1c0 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
2a1d0 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
2a1e0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
2a1f0 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
2a200 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
2a210 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
2a220 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
2a230 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
2a240 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2a250 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
2a260 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
2a270 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
2a280 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
2a290 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
2a2a0 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
2a2b0 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
2a2c0 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
2a2d0 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
2a2e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
2a2f0 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
2a300 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2a310 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
2a320 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
2a330 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
2a340 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
2a350 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
2a360 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2a370 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
2a380 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
2a390 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2a3a0 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2a3b0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
2a3c0 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
2a3d0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2a3e0 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
2a3f0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
2a400 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
2a410 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
2a420 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
2a430 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
2a440 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
2a450 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66  pPager = 0;..#if
2a460 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a470 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20  _MEMORYDB.  if( 
2a480 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45  flags & PAGER_ME
2a490 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44  MORY ){.    memD
2a4a0 62 20 3d 20 31 3b 0a 20 20 20 20 7a 46 69 6c 65  b = 1;.    zFile
2a4b0 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  name = 0;.  }.#e
2a4c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  ndif..  /* Compu
2a4d0 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
2a4e0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
2a4f0 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
2a500 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
2a510 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
2a520 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
2a530 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
2a540 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
2a550 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
2a560 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
2a570 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
2a580 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
2a590 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2a5a0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2a5b0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2a5c0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2a5d0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
2a5e0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
2a5f0 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  oc(nPathname*2);
2a600 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
2a610 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
2a620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a630 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50  EM;.    }.    zP
2a640 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
2a650 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
2a660 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
2a670 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
2a680 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20  fails */.    rc 
2a690 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
2a6a0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
2a6b0 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
2a6c0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
2a6d0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2a6e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2a6f0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2a700 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a710 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38  K && nPathname+8
2a720 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
2a730 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
2a740 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
2a750 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  en when the jour
2a760 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65  nal path require
2a770 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  d by.      ** th
2a780 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
2a790 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20   opened will be 
2a7a0 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e  more than pVfs->
2a7b0 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20  mxPathname.     
2a7c0 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e   ** bytes in len
2a7d0 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  gth. This means 
2a7e0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
2a7f0 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20  not be opened,. 
2a800 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69       ** as it wi
2a810 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
2a820 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
2a830 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65  ournal file or e
2a840 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65  ven.      ** che
2a850 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ck for a hot-jou
2a860 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64  rnal before read
2a870 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
2a880 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a890 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2a8a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
2a8b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a8c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a8d0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2a8e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2a8f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
2a900 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
2a910 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
2a920 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
2a930 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
2a940 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
2a950 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
2a960 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
2a970 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
2a980 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
2a990 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
2a9a0 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
2a9b0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2a9c0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
2a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9e0 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
2a9f0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2aa00 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
2aa30 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
2aa40 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2aa50 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2aa60 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
2aa70 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
2aa80 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
2aa90 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2aaa0 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2aab0 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2aac0 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
2aad0 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2aae0 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2aaf0 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2ab00 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2ab10 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2ab20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2ab30 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
2ab40 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
2ab50 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2ab60 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
2ab70 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
2ab80 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
2ab90 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2aba0 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
2abb0 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
2abc0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
2abd0 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
2abe0 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2abf0 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
2ac00 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
2ac10 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
2ac20 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
2ac30 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2ac40 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
2ac50 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
2ac60 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
2ac70 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
2ac80 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
2ac90 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20  Pathname + 1 +  
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2acb0 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
2acc0 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
2acd0 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  + 1             
2ace0 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
2acf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ad00 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50  MIT_WAL.    + nP
2ad10 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 31 20  athname + 4 + 1 
2ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad30 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2ad40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2ad50 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2ad60 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2ad70 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2ad80 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2ad90 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2ada0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
2adb0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
2adc0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2add0 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
2ade0 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
2adf0 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
2ae00 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
2ae10 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
2ae20 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
2ae30 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
2ae40 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
2ae50 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2ae60 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
2ae70 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
2ae80 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
2ae90 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2aea0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
2aeb0 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
2aec0 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
2aed0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2aee0 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2aef0 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
2af00 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
2af10 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2af20 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2af30 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
2af40 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2af50 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
2af60 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2af70 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
2af80 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
2af90 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
2afa0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2afb0 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
2afc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2afd0 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20  nPathname>0 );. 
2afe0 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
2aff0 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
2b000 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
2b010 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63  e + 1);.    memc
2b020 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
2b030 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
2b040 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2b050 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2b060 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e  zJournal, zPathn
2b070 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2b080 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
2b090 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2b0a0 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
2b0b0 6e 61 6c 22 2c 20 38 29 3b 0a 23 69 66 6e 64 65  nal", 8);.#ifnde
2b0c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2b0d0 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57  L.    pPager->zW
2b0e0 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a  al = &pPager->zJ
2b0f0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2b100 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  +8+1];.    memcp
2b110 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  y(pPager->zWal, 
2b120 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2b130 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2b140 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b  y(&pPager->zWal[
2b150 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61  nPathname], "-wa
2b160 6c 22 2c 20 34 29 3b 0a 23 65 6e 64 69 66 0a 20  l", 4);.#endif. 
2b170 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2b180 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
2b190 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
2b1a0 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
2b1b0 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
2b1c0 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
2b1d0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2b1e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2b1f0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2b200 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
2b210 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b230 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
2b240 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
2b250 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2b260 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2b270 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2b280 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
2b290 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
2b2a0 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d      assert( !mem
2b2b0 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  Db );.    readOn
2b2c0 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
2b2d0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2b2e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2b2f0 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
2b300 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
2b310 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2b320 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
2b330 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
2b340 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
2b350 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
2b360 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2b370 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
2b380 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2b390 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2b3a0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
2b3b0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
2b3c0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
2b3d0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2b3e0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
2b3f0 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
2b400 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
2b410 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
2b420 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
2b430 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
2b440 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
2b450 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2b460 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
2b470 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65  Only ){.      se
2b480 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2b490 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
2b4a0 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
2b4b0 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
2b4c0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2b4d0 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
2b4e0 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2b4f0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2b500 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ze ){.        if
2b510 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
2b520 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
2b530 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2b540 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2b550 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2b560 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2b570 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
2b580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b590 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2b5a0 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63  (u32)pPager->sec
2b5b0 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
2b5c0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65   }.      }.#ifde
2b5d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2b5e0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2b5f0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74     {.        int
2b600 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
2b610 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2b620 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
2b630 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
2b640 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  i;.        asser
2b650 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2b660 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
2b670 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
2b680 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2b690 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
2b6a0 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
2b6b0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
2b6c0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2b6d0 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
2b6e0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
2b6f0 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
2b700 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2b710 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
2b720 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  *2){.          i
2b730 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2b740 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2b750 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2b760 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2b770 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ii;.          }
2b780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b790 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2b7a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2b7b0 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
2b7c0 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
2b7d0 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
2b7e0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
2b7f0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2b800 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
2b810 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2b820 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
2b830 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
2b840 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
2b850 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
2b860 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
2b870 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b880 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
2b890 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
2b8a0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2b8b0 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
2b8c0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2b8d0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
2b8e0 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
2b8f0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2b900 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
2b910 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
2b920 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
2b930 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
2b940 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  */ .    tempFile
2b950 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2b960 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
2b970 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61  _READER;.    pPa
2b980 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43  ger->eLock = EXC
2b990 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
2b9a0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
2b9b0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2b9c0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
2b9d0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2b9e0 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
2b9f0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
2ba00 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
2ba10 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
2ba20 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2ba30 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
2ba40 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
2ba50 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
2ba60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ba70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2ba80 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
2ba90 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
2baa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2bab0 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
2bac0 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
2bad0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2bae0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2baf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
2bb00 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2bb10 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
2bb20 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
2bb30 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50  free the .  ** P
2bb40 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
2bb50 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
2bb60 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
2bb70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2bb80 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2bb90 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b  er->pTmpSpace );
2bba0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2bbb0 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2bbc0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2bbd0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
2bbe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2bbf0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2bc00 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
2bc10 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  . */.  assert( n
2bc20 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20  Extra<1000 );.  
2bc30 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
2bc40 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74  nExtra);.  sqlit
2bc50 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
2bc60 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
2bc70 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
2bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
2bc90 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
2bca0 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
2bcb0 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
2bcc0 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
2bcd0 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
2bce0 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
2bcf0 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
2bd00 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2bd10 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
2bd20 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
2bd30 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
2bd40 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
2bd50 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2bd60 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
2bd70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
2bd80 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64  adlock = (noRead
2bd90 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
2bda0 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61  ) ?1:0;.  /* pPa
2bdb0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
2bdc0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2bdd0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
2bde0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2bdf0 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
2be00 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2be10 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2be20 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
2be30 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2be40 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
2be50 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2be60 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
2be70 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
2be80 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2be90 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
2bea0 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  CK; */.#if 0.  a
2beb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2bec0 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c  tate == (tempFil
2bed0 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e ? PAGER_EXCLUS
2bee0 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f  IVE : PAGER_UNLO
2bef0 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  CK) );.#endif.  
2bf00 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
2bf10 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
2bf20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
2bf30 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
2bf40 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
2bf50 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2bf60 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
2bf70 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
2bf80 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2bf90 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
2bfa0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2bfb0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2bfc0 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
2bfd0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2bfe0 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
2bff0 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
2c000 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2c010 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2c020 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
2c030 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
2c040 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
2c050 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
2c060 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75  nly;.  assert( u
2c070 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61  seJournal || pPa
2c080 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2c090 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
2c0a0 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
2c0b0 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
2c0c0 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65  fullSync = pPage
2c0d0 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a  r->noSync ?0:1;.
2c0e0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
2c0f0 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ags = pPager->no
2c100 53 79 6e 63 20 3f 20 30 20 3a 20 53 51 4c 49 54  Sync ? 0 : SQLIT
2c110 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2c120 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2c130 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d  cFlags = pPager-
2c140 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 2f 2a  >syncFlags;.  /*
2c150 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
2c160 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2c170 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
2c180 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
2c190 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
2c1a0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
2c1b0 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78  Extra = (u16)nEx
2c1c0 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
2c1d0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
2c1e0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2c1f0 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
2c200 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69  MIT;.  assert( i
2c210 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2c220 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b  ) || tempFile );
2c230 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
2c240 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
2c250 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  !useJournal ){. 
2c260 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2c270 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2c280 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a  OURNALMODE_OFF;.
2c290 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44    }else if( memD
2c2a0 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
2c2b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2c2c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2c2d0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
2c2e0 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
2c2f0 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
2c300 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
2c310 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
2c320 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
2c330 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
2c340 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  t;.  /* memset(p
2c350 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
2c360 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
2c370 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a  aHash)); */..  *
2c380 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
2c390 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2c3a0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
2c3b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2c3c0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
2c3d0 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
2c3e0 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
2c3f0 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
2c400 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
2c410 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
2c420 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
2c430 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
2c440 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
2c450 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
2c460 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
2c470 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
2c480 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2c490 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
2c4a0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2c4b0 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
2c4c0 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
2c4d0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2c4e0 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
2c4f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2c500 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2c510 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
2c520 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
2c530 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
2c540 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
2c550 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2c560 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2c570 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
2c580 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2c590 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
2c5a0 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
2c5b0 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
2c5c0 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
2c5d0 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
2c5e0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2c5f0 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
2c600 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2c610 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
2c620 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2c630 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
2c640 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
2c650 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
2c660 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
2c670 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
2c680 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
2c690 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2c6a0 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
2c6b0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2c6c0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
2c6d0 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
2c6e0 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
2c6f0 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
2c700 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
2c710 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2c720 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2c730 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
2c740 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
2c750 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2c760 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
2c770 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
2c780 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
2c790 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
2c7a0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
2c7b0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
2c7c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2c7d0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2c7e0 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
2c7f0 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
2c800 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
2c810 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
2c820 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
2c830 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
2c840 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
2c850 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2c860 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2c870 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
2c880 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
2c890 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
2c8a0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2c8b0 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
2c8c0 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
2c8d0 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
2c8e0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2c8f0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
2c900 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2c910 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
2c920 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
2c930 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
2c940 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2c950 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2c960 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
2c970 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2c980 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
2c990 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
2c9a0 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
2c9b0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
2c9c0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2c9d0 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
2c9e0 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
2c9f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2ca00 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
2ca10 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
2ca20 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
2ca30 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2ca40 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2ca50 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
2ca60 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2ca70 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2ca80 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
2ca90 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
2caa0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2cab0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
2cac0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
2cad0 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
2cae0 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
2caf0 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
2cb00 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2cb10 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
2cb20 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2cb30 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
2cb40 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2cb50 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2cb60 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
2cb70 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
2cb80 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2cb90 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2cba0 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
2cbb0 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
2cbc0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
2cbd0 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
2cbe0 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
2cbf0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
2cc00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
2cc10 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
2cc20 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
2cc30 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2cc40 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
2cc50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cc60 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
2cc70 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
2cc80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2cc90 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
2cca0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2ccb0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
2ccc0 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
2ccd0 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
2cce0 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
2ccf0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
2cd00 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
2cd10 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
2cd20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
2cd30 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
2cd40 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
2cd50 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
2cd60 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
2cd70 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2cd80 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
2cd90 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
2cda0 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
2cdb0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
2cdc0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2cdd0 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
2cde0 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
2cdf0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2ce00 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
2ce10 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
2ce20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
2ce30 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
2ce40 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
2ce50 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
2ce60 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2ce70 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
2ce80 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
2ce90 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
2cea0 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
2ceb0 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
2cec0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2ced0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2cee0 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
2cef0 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
2cf00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2cf10 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
2cf20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
2cf30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cf40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2cf50 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
2cf60 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
2cf70 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a  /* Check the siz
2cf80 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2cf90 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f  e file. If it co
2cfa0 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65  nsists of 0 page
2cfb0 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  s,.      ** then
2cfc0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2cfd0 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68  nal file. See th
2cfe0 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
2cff0 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20   above for .    
2d000 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69    ** the reasoni
2d010 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65  ng here.  Delete
2d020 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f   the obsolete jo
2d030 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72  urnal file under
2d040 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45  .      ** a RESE
2d050 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f  RVED lock to avo
2d060 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  id race conditio
2d070 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20  ns and to avoid 
2d080 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  violating.      
2d090 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20  ** [H33020]..   
2d0a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2d0b0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
2d0c0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2d0d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2d0e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d0f0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
2d100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2d110 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
2d120 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2d130 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
2d140 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
2d150 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
2d160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d170 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
2d180 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
2d190 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
2d1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d1b0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
2d1c0 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
2d1d0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2d1e0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2d1f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d200 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
2d210 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2d220 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d230 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
2d240 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2d250 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
2d260 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
2d270 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
2d280 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
2d290 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2d2a0 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
2d2b0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
2d2c0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
2d2d0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
2d2e0 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
2d2f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2d300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2d310 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2d320 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
2d330 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
2d340 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
2d350 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
2d360 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
2d370 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
2d380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d390 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2d3a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2d3b0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
2d3c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
2d3d0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2d3e0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2d3f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2d400 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2d410 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2d420 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
2d430 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d440 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2d450 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d460 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
2d470 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2d480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2d490 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
2d4a0 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
2d4b0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
2d4c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d4d0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
2d4e0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
2d4f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2d500 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2d510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2d520 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2d530 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2d540 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2d550 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2d560 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d570 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2d580 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
2d590 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2d5a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
2d5b0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
2d5c0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
2d5d0 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
2d5e0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
2d5f0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
2d600 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
2d610 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20     ** its has a 
2d620 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
2d630 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
2d640 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
2d650 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
2d660 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
2d670 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
2d680 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
2d690 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
2d6a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
2d6b0 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
2d6c0 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
2d6d0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2d6e0 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
2d6f0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2d700 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
2d710 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
2d720 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
2d730 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2d740 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
2d750 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
2d760 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
2d770 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
2d780 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
2d790 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
2d7a0 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
2d7b0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2d7c0 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
2d7d0 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
2d7e0 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
2d7f0 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
2d800 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2d810 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
2d820 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2d830 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2d850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d860 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2d870 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2d880 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2d890 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
2d8a0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2d8b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2d8c0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2d8d0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
2d8e0 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
2d8f0 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
2d900 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
2d910 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
2d920 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
2d930 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
2d940 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
2d950 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2d960 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2d970 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2d980 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
2d990 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
2d9a0 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
2d9b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2d9c0 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
2d9d0 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
2d9e0 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
2d9f0 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
2da00 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
2da10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2da20 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
2da30 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
2da40 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
2da50 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
2da60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2da70 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
2da80 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
2da90 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
2daa0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
2dab0 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
2dac0 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
2dad0 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
2dae0 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
2daf0 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
2db00 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
2db10 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
2db20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
2db30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
2db40 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
2db50 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
2db60 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
2db70 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
2db80 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2db90 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
2dba0 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
2dbb0 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
2dbc0 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
2dbd0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
2dbe0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2dbf0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2dc00 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
2dc10 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
2dc20 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
2dc30 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2dc40 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
2dc50 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
2dc60 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
2dc70 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
2dc80 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2dc90 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
2dca0 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
2dcb0 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
2dcc0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2dcd0 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
2dce0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
2dcf0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
2dd00 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
2dd10 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2dd20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
2dd30 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2dd40 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2dd50 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
2dd60 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
2dd70 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
2dd80 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
2dd90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
2dda0 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
2ddb0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
2ddc0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2ddd0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2dde0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2ddf0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
2de00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2de10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2de20 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2de30 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2de40 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
2de50 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
2de60 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
2de70 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
2de80 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
2de90 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
2dea0 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
2deb0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
2dec0 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
2ded0 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
2dee0 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
2def0 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
2df00 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
2df10 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
2df20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
2df30 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f  ccess mode..  */
2df40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2df50 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2df60 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2df70 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
2df80 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2df90 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2dfa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2dfb0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2dfc0 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
2dfd0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
2dfe0 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45  ADER );.  if( NE
2dff0 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
2e000 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
2e010 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2e020 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66  errCode; }..  if
2e030 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
2e040 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
2e050 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2e060 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
2e070 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
2e080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2e090 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
2e0a0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
2e0b0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
2e0c0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
2e0d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e0e0 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30  r->noReadlock==0
2e0f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 72 65 61 64   || pPager->read
2e100 4f 6e 6c 79 20 29 3b 0a 0a 20 20 20 20 69 66 28  Only );..    if(
2e110 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
2e120 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
2e130 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
2e140 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
2e150 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2e160 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e180 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e190 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
2e1a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
2e1b0 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
2e1c0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
2e1d0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
2e1e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2e1f0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
2e200 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
2e210 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
2e220 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
2e230 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2e240 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
2e250 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2e260 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
2e270 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
2e280 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
2e290 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
2e2a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
2e2b0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
2e2c0 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
2e2d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e2e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e2f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
2e300 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
2e310 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
2e320 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
2e330 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2e340 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2e350 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
2e360 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
2e370 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
2e380 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
2e390 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
2e3a0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
2e3b0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
2e3c0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
2e3d0 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
2e3e0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
2e3f0 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
2e400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2e410 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
2e420 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
2e430 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
2e440 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
2e450 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
2e460 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
2e470 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
2e480 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
2e490 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
2e4a0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
2e4b0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
2e4c0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
2e4d0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2e4e0 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
2e4f0 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
2e500 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
2e510 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
2e520 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
2e530 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
2e540 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
2e550 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
2e560 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
2e570 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
2e580 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
2e590 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
2e5a0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
2e5b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c   **.      ** Unl
2e5c0 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
2e5d0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2e5e0 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  =exclusive mode,
2e5f0 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20   the lock is.   
2e600 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64     ** downgraded
2e610 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   to SHARED_LOCK 
2e620 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
2e630 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20  tion returns..  
2e640 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2e650 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
2e660 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
2e670 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2e680 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e690 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
2e6a0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
2e6b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20  .      /* If it 
2e6c0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
2e6d0 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65  pen and the file
2e6e0 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
2e6f0 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
2e700 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20   ** journal for 
2e710 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2e720 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20  s. Write access 
2e730 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
2e740 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e  use .      ** in
2e750 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
2e760 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
2e770 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
2e780 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20  be kept open .  
2e790 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69      ** and possi
2e7a0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
2e7b0 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
2e7c0 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65   on. Also, write
2e7d0 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a  -access .      *
2e7e0 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71  * is usually req
2e7f0 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a  uired to finaliz
2e800 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e  e the journal in
2e810 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65   journal_mode=pe
2e820 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rsist .      ** 
2e830 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66  mode (and also f
2e840 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
2e850 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65  truncate on some
2e860 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20   systems)..     
2e870 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
2e880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
2e890 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75   not exist, it u
2e8a0 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61  sually means tha
2e8b0 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a  t some .      **
2e8c0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2e8d0 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
2e8e0 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
2e8f0 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
2e900 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65     ** this conne
2e910 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74  ction obtained t
2e920 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
2e930 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20  k above. Or, it 
2e940 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65  .      ** may me
2e950 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65  an that the page
2e960 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72  r was in the err
2e970 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
2e980 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
2e990 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2e9a0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2e9b0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
2e9c0 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
2e9d0 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
2e9e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2e9f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ea00 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2ea10 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2ea20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78  .        int bEx
2ea30 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
2ea40 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
2ea50 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2ea60 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  s */.        rc 
2ea70 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
2ea80 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s(.            p
2ea90 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2eaa0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2eab0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45  CESS_EXISTS, &bE
2eac0 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20  xists);.        
2ead0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2eae0 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a  K && bExists ){.
2eaf0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
2eb00 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
2eb10 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
2eb20 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
2eb30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2eb40 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
2eb50 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2eb60 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2eb70 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2eb80 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2eb90 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2eba0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2ebb0 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
2ebc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ebd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2ebe0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ebf0 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
2ec00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ec10 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
2ec20 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2ec30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ec40 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2ec50 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
2ec60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
2ec70 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
2ec80 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
2ec90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2eca0 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  }. .      /* Pla
2ecb0 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
2ecc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
2ecd0 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
2ece0 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
2ecf0 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
2ed00 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
2ed10 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68  . Purge the cach
2ed20 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  e before.      *
2ed30 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  * playing back t
2ed40 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73  he hot-journal s
2ed50 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20  o that we don't 
2ed60 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20  end up with.    
2ed70 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73    ** an inconsis
2ed80 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e  tent cache.  Syn
2ed90 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  c the hot journa
2eda0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
2edb0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63  .      ** it bac
2edc0 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63  k since the proc
2edd0 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64  ess that crashed
2ede0 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f   and left the ho
2edf0 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
2ee00 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20  ** probably did 
2ee10 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20  not sync it and 
2ee20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  we are required 
2ee30 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20  to always sync. 
2ee40 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
2ee50 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
2ee60 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ng it back..    
2ee70 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
2ee80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2ee90 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  d) ){.        as
2eea0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2eeb0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
2eec0 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
2eed0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
2eee0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2eef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ef00 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2ef10 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
2ef20 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
2ef30 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2ef40 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
2ef50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ef60 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
2ef70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2ef80 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
2ef90 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
2efa0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
2efb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2efc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2efd0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2efe0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
2eff0 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
2f000 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2f010 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20  ng to open.     
2f020 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61     ** or roll ba
2f030 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
2f040 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
2f050 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2f060 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
2f070 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
2f080 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
2f090 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
2f0a0 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63  turning to unloc
2f0b0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  k.        ** the
2f0c0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e   file. If the un
2f0d0 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69  lock attempt fai
2f0e0 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65  ls, then Pager.e
2f0f0 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20  Lock must be.   
2f100 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55       ** set to U
2f110 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65  NKNOWN_LOCK (see
2f120 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
2f130 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
2f140 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55  or .        ** U
2f150 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76  NKNOWN_LOCK abov
2f160 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  e for an explana
2f170 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20  tion). .        
2f180 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
2f190 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61   order to get pa
2f1a0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20  ger_unlock() to 
2f1b0 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67  do this, set Pag
2f1c0 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20  er.eState to.   
2f1d0 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52       ** PAGER_ER
2f1e0 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  ROR now. This is
2f1f0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f   not actually co
2f200 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73  unted as a trans
2f210 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ition.        **
2f220 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20   to ERROR state 
2f230 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61  in the state dia
2f240 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20  gram at the top 
2f250 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20  of this file,.  
2f260 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77        ** since w
2f270 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2f280 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67  same call to pag
2f290 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
2f2a0 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a   very.        **
2f2b0 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74   shortly transit
2f2c0 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  ion the pager ob
2f2d0 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e  ject to the OPEN
2f2e0 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a   state. Calling.
2f2f0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72          ** asser
2f300 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
2f310 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20  would fail now, 
2f320 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  as it should not
2f330 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
2f340 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e       ** to be in
2f350 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
2f360 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f  n there are zero
2f370 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
2f380 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
2f390 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20  ferences..      
2f3a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67    */.        pag
2f3b0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2f3c0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
2f3d0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2f3e0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
2f3f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2f400 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2f410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2f420 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48  Pager->eLock==SH
2f430 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
2f440 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
2f450 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2f460 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
2f470 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  >SHARED_LOCK).  
2f480 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
2f490 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
2f4a0 65 6d 70 46 69 6c 65 20 0a 20 20 20 20 20 26 26  empFile .     &&
2f4b0 20 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75   (pPager->pBacku
2f4c0 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63  p || sqlite3Pcac
2f4d0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
2f4e0 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 29 20  er->pPCache)>0) 
2f4f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2f500 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
2f510 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
2f520 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
2f530 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
2f540 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
2f550 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
2f560 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
2f570 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
2f580 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
2f590 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2f5a0 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
2f5b0 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
2f5c0 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
2f5d0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
2f5e0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2f5f0 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
2f600 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
2f610 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
2f620 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
2f630 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
2f640 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
2f650 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
2f660 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
2f670 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
2f680 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
2f690 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
2f6a0 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
2f6b0 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
2f6c0 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
2f6d0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
2f6e0 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
2f6f0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
2f700 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
2f710 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
2f720 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
2f730 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
2f740 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
2f750 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
2f760 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
2f770 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
2f780 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
2f790 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
2f7a0 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
2f7b0 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
2f7c0 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
2f7d0 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
2f7e0 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
2f7f0 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
2f800 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
2f810 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
2f820 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  e = 0;.      cha
2f830 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
2f840 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
2f850 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20  leVers)];..     
2f860 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
2f870 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
2f880 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2f890 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64  rc ) goto failed
2f8a0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  ;..      if( nPa
2f8b0 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ge>0 ){.        
2f8c0 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
2f8d0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2f8e0 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
2f8f0 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
2f900 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
2f910 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
2f920 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
2f930 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
2f940 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66   24);.        if
2f950 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2f970 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
2f980 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
2f990 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
2f9a0 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
2f9b0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
2f9c0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ));.      }..   
2f9d0 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
2f9e0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2f9f0 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
2fa00 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
2fa10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2fa20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
2fa30 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
2fa40 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2fa50 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
2fa60 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
2fa70 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
2fa80 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
2fa90 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
2faa0 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
2fab0 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
2fac0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
2fad0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2fae0 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
2faf0 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  esent(pPager);.#
2fb00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fb10 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72  IT_WAL.    asser
2fb20 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  t( pPager->pWal=
2fb30 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
2fb40 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _OK );.#endif.  
2fb50 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
2fb60 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
2fb70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2fb80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2fb90 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
2fba0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
2fbb0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
2fbc0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
2fbd0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
2fbe0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2fbf0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
2fc00 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2fc10 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  r, &pPager->dbSi
2fc20 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  ze);.  }.. faile
2fc30 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
2fc40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2fc50 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
2fc60 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
2fc70 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
2fc80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2fc90 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2fca0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2fcb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2fcc0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
2fcd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2fce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
2fcf0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
2fd00 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
2fd10 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
2fd20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
2fd30 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
2fd40 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
2fd50 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
2fd60 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
2fd70 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
2fd80 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
2fd90 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
2fda0 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
2fdb0 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
2fdc0 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
2fdd0 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
2fde0 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
2fdf0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2fe00 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
2fe10 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
2fe20 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
2fe30 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
2fe40 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
2fe50 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
2fe60 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20  PCache)==0) ){. 
2fe70 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
2fe80 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
2fe90 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2fea0 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
2feb0 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
2fec0 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
2fed0 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
2fee0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
2fef0 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
2ff00 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
2ff10 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
2ff20 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
2ff30 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
2ff40 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
2ff50 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
2ff60 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
2ff70 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
2ff80 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
2ff90 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
2ffa0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
2ffb0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
2ffc0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
2ffd0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2ffe0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
2fff0 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
30000 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30010 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
30020 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
30030 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
30040 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
30050 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
30060 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
30070 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
30080 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
30090 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
300a0 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
300b0 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
300c0 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
300d0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
300e0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
300f0 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
30100 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
30110 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
30120 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
30130 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
30140 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
30150 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
30160 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
30170 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
30180 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
30190 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
301a0 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
301b0 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
301c0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
301d0 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
301e0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
301f0 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
30200 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  if a .** non-zer
30210 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  o value is passe
30220 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65  d as the noConte
30230 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  nt parameter and
30240 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
30250 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
30260 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
30270 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
30280 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
30290 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
302a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
302b0 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
302c0 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
302d0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
302e0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
302f0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
30300 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
30310 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
30320 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
30330 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
30340 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63  he page. This oc
30350 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65  curs in two sepe
30360 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a  rate scenarios:.
30370 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
30380 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
30390 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
303a0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
303b0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
303c0 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
303d0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
303e0 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
303f0 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
30400 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
30410 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62  o the cache to b
30420 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  e filled with th
30430 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
30440 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
30450 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
30460 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
30470 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
30480 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
30490 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
304a0 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67  tead of.** being
304b0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
304c0 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
304d0 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
304e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
304f0 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
30500 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
30510 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
30520 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
30530 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
30540 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
30550 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
30560 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
30570 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
30580 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
30590 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
305a0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
305b0 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
305c0 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
305d0 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
305e0 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
305f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
30600 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
30610 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
30620 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
30630 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
30640 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
30650 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
30660 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
30670 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
30680 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
30690 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
306a0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
306b0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
306c0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
306d0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
306e0 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
306f0 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
30700 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
30710 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
30720 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
30730 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
30740 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
30750 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
30760 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
30770 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
30780 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
30790 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
307a0 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
307b0 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
307c0 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
307d0 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
307e0 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
307f0 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
30800 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
30810 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
30820 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
30830 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
30840 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
30850 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
30860 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
30870 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
30880 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
30890 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
308a0 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
308b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
308c0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
308d0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
308e0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
308f0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
30900 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
30910 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
30920 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
30930 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
30940 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
30950 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
30960 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
30970 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
30980 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
30990 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
309a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
309b0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
309c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
309d0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
309e0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
309f0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
30a00 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
30a10 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  );..  if( pgno==
30a20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
30a30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
30a40 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
30a50 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
30a60 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
30a70 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
30a80 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  or immediately. 
30a90 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
30aa0 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67   request the pag
30ab0 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68  e from the PCach
30ac0 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66  e layer. */.  if
30ad0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
30ae0 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e!=SQLITE_OK ){.
30af0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
30b00 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
30b10 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
30b20 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
30b30 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
30b40 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29  pgno, 1, ppPage)
30b50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
30b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30b70 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
30b80 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
30b90 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
30ba0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
30bb0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
30bc0 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
30bd0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
30be0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
30bf0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
30c00 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
30c10 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
30c20 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
30c30 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
30c40 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
30c50 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
30c60 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
30c70 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
30c80 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
30c90 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
30ca0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
30cb0 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  || (*ppPage)->pP
30cc0 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ager==0 );..  if
30cd0 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
30ce0 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e  ger && !noConten
30cf0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
30d00 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61  his case the pca
30d10 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  che already cont
30d20 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ains an initiali
30d30 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20  zed copy of.    
30d40 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74  ** the page. Ret
30d50 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74  urn without furt
30d60 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20  her ado.  */.   
30d70 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50   assert( pgno<=P
30d80 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26  AGER_MAX_PGNO &&
30d90 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f   pgno!=PAGER_MJ_
30da0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
30db0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
30dc0 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20  Pager->nHit);.  
30dd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30de0 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
30df0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
30e00 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
30e10 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
30e20 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
30e30 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
30e40 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20  tialized.  */.. 
30e50 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
30e60 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
30e70 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b    pPg = *ppPage;
30e80 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
30e90 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20   = pPager;..    
30ea0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
30eb0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
30ec0 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
30ed0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
30ee0 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  age.    ** numbe
30ef0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
30f00 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73  his, or the unus
30f10 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c  ed locking-page,
30f20 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a   is requested. *
30f30 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50  /.    if( pgno>P
30f40 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
30f50 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
30f60 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
30f70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30f80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
30f90 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
30fa0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
30fb0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d    }..    if( MEM
30fc0 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  DB || pPager->db
30fd0 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43  Size<pgno || noC
30fe0 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65  ontent || !isOpe
30ff0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
31000 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
31010 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
31020 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
31030 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
31040 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
31050 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
31060 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f    }.      if( no
31070 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
31080 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
31090 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e   set the bits in
310a0 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62   the InJournal b
310b0 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65  it-vectors is be
310c0 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  nign..        **
310d0 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73   It merely means
310e0 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64   that we might d
310f0 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72  o some extra wor
31100 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a  k to journal a .
31110 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
31120 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
31130 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
31140 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ed.  Nevertheles
31150 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20  s, be sure .    
31160 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
31170 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20  he case where a 
31180 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
31190 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
311a0 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20   to set .       
311b0 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62   ** a bit in a b
311c0 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20  it vector..     
311d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
311e0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
311f0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
31200 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
31210 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
31220 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
31230 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
31240 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
31250 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
31260 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
31270 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
31280 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
31290 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
312a0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
312b0 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
312c0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
312d0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
312e0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
312f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
31300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
31310 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
31320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
31330 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
31340 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
31350 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f  eSize);.      IO
31360 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
31370 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
31380 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
31390 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
313a0 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
313b0 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ger );.      rc 
313c0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
313d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
313e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
313f0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
31400 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
31410 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
31420 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
31430 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  sh(pPg);.  }..  
31440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31450 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65  ;..pager_acquire
31460 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20  _err:.  assert( 
31470 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
31480 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
31490 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
314a0 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rop(pPg);.  }.  
314b0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
314c0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  sed(pPager);..  
314d0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  *ppPage = 0;.  r
314e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
314f0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
31500 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
31510 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
31520 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
31530 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
31540 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
31550 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
31560 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
31570 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
31580 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
31590 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  e. .**.** See al
315a0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
315b0 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
315c0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
315d0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
315e0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
315f0 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
31600 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
31610 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
31620 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
31630 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
31640 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
31650 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
31660 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
31670 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
31680 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
31690 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
316a0 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
316b0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
316c0 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
316d0 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
316e0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
316f0 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
31700 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  g = 0;.  assert(
31710 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
31720 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
31730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
31740 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20  ger->pPCache!=0 
31750 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
31760 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
31770 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
31780 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
31790 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73 71  ER_ERROR );.  sq
317a0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
317b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
317c0 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29  , pgno, 0, &pPg)
317d0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ;.  return pPg;.
317e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
317f0 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
31800 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
31810 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
31820 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
31830 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
31840 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
31850 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
31860 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
31870 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
31880 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
31890 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
318a0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
318b0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
318c0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
318d0 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f  * removed..*/.vo
318e0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
318f0 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
31900 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  ){.  if( pPg ){.
31910 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
31920 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
31930 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
31940 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
31950 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49      pagerUnlockI
31960 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
31970 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
31980 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
31990 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
319a0 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
319b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
319c0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
319d0 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
319e0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
319f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
31a00 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
31a10 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
31a20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
31a30 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
31a40 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
31a50 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
31a60 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
31a70 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
31a80 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
31a90 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
31aa0 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
31ab0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
31ac0 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
31ad0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
31ae0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
31af0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
31b00 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
31b10 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
31b20 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
31b30 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
31b40 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
31b50 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
31b60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
31b70 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
31b80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
31b90 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
31ba0 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
31bb0 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
31bc0 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
31bd0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
31be0 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
31bf0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
31c00 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
31c10 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
31c20 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
31c30 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
31c40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
31c50 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
31c60 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
31c70 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
31c80 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
31c90 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
31ca0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
31cb0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
31cc0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
31cd0 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
31ce0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
31cf0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
31d00 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
31d10 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
31d20 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
31d30 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
31d40 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
31d50 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
31d60 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
31d70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31d80 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
31d90 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
31da0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
31db0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
31dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31dd0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
31de0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
31df0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
31e00 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
31e10 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
31e20 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
31e30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31e40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
31e50 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
31e60 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
31e70 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
31e80 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
31e90 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
31ea0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
31eb0 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
31ec0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
31ed0 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
31ee0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
31ef0 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
31f00 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
31f10 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
31f20 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
31f30 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
31f40 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
31f50 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
31f60 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
31f70 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
31f80 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69  r->errCode;..  i
31f90 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
31fa0 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
31fb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
31fc0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
31fd0 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61  E_OFF ){.    pPa
31fe0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
31ff0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
32000 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
32010 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
32020 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
32030 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l==0 ){.      re
32040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
32050 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  M;.    }.  .    
32060 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
32070 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
32080 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
32090 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  en. */.    if( !
320a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
320b0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
320c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
320d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
320e0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
320f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32100 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
32110 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
32120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32130 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
32140 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  gs =            
32150 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
32160 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72  ags to open jour
32170 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
32180 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
32190 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
321a0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
321b0 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
321c0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
321d0 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
321e0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
321f0 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
32200 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a  N_TEMP_JOURNAL):
32210 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51  .            (SQ
32220 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
32230 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20  OURNAL).        
32240 20 20 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51    );.  #ifdef SQ
32250 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
32260 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
32270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
32280 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20  rnalOpen(.      
32290 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
322a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
322b0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
322c0 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
322d0 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 20  (pPager).       
322e0 20 29 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20   );.  #else.    
322f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32300 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
32310 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
32320 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
32330 73 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a  s, 0);.  #endif.
32340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
32350 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
32360 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
32370 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
32380 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a    }.  .  .    /*
32390 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
323a0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
323b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
323c0 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20  ile and open .  
323d0 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
323e0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
323f0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
32400 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32410 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  ){.      /* TODO
32420 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f  : Check if all o
32430 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c  f these are real
32440 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ly required. */.
32450 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
32460 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ec = 0;.      pP
32470 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
32480 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
32490 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
324a0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
324b0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
324c0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
324d0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
324e0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
324f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32500 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
32510 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
32520 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
32530 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
32540 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
32550 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
32560 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32570 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
32580 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
32590 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
325a0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  = PAGER_WRITER_C
325b0 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20  ACHEMOD;.  }..  
325c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
325d0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74  .** Begin a writ
325e0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  e-transaction on
325f0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
32600 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
32610 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e  a .** write-tran
32620 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
32630 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  ady been opened,
32640 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
32650 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
32660 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61   If the exFlag a
32670 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
32680 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
32690 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
326a0 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  ED.** lock on th
326b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
326c0 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
326d0 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ue, then acquire
326e0 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20   at least.** an 
326f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
32700 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
32710 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
32720 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66  no locking .** f
32730 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65  unctions need be
32740 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
32750 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
32760 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ry argument is n
32770 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  on-zero, then an
32780 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70  y sub-journal op
32790 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ened.** within t
327a0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
327b0 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61  will be opened a
327c0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
327d0 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73  ile. This.** has
327e0 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68   no effect if th
327f0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
32800 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
32810 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68  (as it may be wh
32820 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e  en.** running in
32830 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
32840 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73   or if the trans
32850 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  action does not 
32860 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62  require a.** sub
32870 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65  -journal. If the
32880 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
32890 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20  gument is zero, 
328a0 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65  then any require
328b0 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d.** sub-journal
328c0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
328d0 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61  in-memory if pPa
328e0 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ger is an in-mem
328f0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a  ory database, .*
32900 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d  * or using a tem
32910 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65  porary file othe
32920 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
32930 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
32940 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
32950 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73  nt exFlag, int s
32960 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20  ubjInMemory){.  
32970 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
32980 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  OK;..  if( pPage
32990 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  r->errCode ) ret
329a0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
329b0 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
329c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
329d0 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70  AGER_READER && p
329e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
329f0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70  GER_ERROR );.  p
32a00 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
32a10 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e  ory = (u8)subjIn
32a20 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41  Memory;..  if( A
32a30 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53  LWAYS(pPager->eS
32a40 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
32a50 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ER) ){.    asser
32a60 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
32a70 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20  urnal==0 );..   
32a80 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
32a90 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
32aa0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
32ab0 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  r is configured 
32ac0 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d  to use locking_m
32ad0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61  ode=exclusive, a
32ae0 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65  nd an.      ** e
32af0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
32b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
32b10 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c   not already hel
32b20 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77  d, obtain it now
32b30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
32b40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
32b50 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71  lusiveMode && sq
32b60 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
32b70 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
32b80 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20  al, -1) ){.     
32b90 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
32ba0 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c  kDb(pPager, EXCL
32bb0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
32bc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32bd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32be0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
32bf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32c00 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
32c10 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
32c20 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20  >pWal, 1);.     
32c30 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61   }..      /* Gra
32c40 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  b the write lock
32c50 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   on the log file
32c60 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
32c70 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20   upgrade to.    
32c80 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52    ** PAGER_RESER
32c90 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72  VED state. Other
32ca0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
32cb0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
32cc0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
32cd0 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64  ** The busy-hand
32ce0 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b  ler is not invok
32cf0 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f  ed if another co
32d00 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  nnection already
32d10 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  .      ** holds 
32d20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20  the write-lock. 
32d30 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  If possible, the
32d40 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
32d50 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20  l call it..     
32d60 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
32d70 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
32d80 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
32d90 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
32da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
32db0 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
32dc0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
32dd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
32de0 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
32df0 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20  ameter.      ** 
32e00 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d  is true, then im
32e10 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64  mediately upgrad
32e20 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43  e this to an EXC
32e30 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
32e40 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68  .      ** busy-h
32e50 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
32e60 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
32e70 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68   upgrading to th
32e80 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20  e EXCLUSIVE.    
32e90 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e    ** lock, but n
32ea0 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  ot when obtainin
32eb0 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  g the RESERVED l
32ec0 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
32ed0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
32ee0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
32ef0 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
32f00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32f10 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29  E_OK && exFlag )
32f20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
32f30 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
32f40 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
32f50 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
32f60 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
32f70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32f80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  ){.      /* Chan
32f90 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43  ge to WRITER_LOC
32fa0 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20  KED state..     
32fb0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c   **.      ** WAL
32fc0 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65 72   mode sets Pager
32fd0 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47 45 52  .eState to PAGER
32fe0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f  _WRITER_LOCKED o
32ff0 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  r CACHEMOD.     
33000 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20   ** when it has 
33010 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  an open transact
33020 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74  ion, but never t
33030 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53  o DBMOD or FINIS
33040 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  HED..      ** Th
33050 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
33060 20 74 68 6f 73 65 20 73 74 61 74 65 73 20 74 68   those states th
33070 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62  e code to roll b
33080 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  ack savepoint . 
33090 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
330a0 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61  ions may copy da
330b0 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ta from the sub-
330c0 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65  journal into the
330d0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20   database .     
330e0 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c   ** file as well
330f0 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67   as into the pag
33100 65 20 63 61 63 68 65 2e 20 57 68 69 63 68 20 77  e cache. Which w
33110 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63  ould be incorrec
33120 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57  t in .      ** W
33130 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  AL mode..      *
33140 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
33150 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
33160 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20  RITER_LOCKED;.  
33170 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
33180 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
33190 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
331a0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
331b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
331c0 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
331d0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
331e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
331f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
33200 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
33210 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
33220 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
33230 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33240 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
33250 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
33260 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
33270 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33280 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
33290 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
332a0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
332b0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
332c0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
332d0 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  (("TRANSACTION %
332e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
332f0 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72  ager)));.  retur
33300 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
33310 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74  ark a single dat
33320 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
33330 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ble. The page is
33340 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
33350 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e  e .** main journ
33360 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
33370 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49  l as required. I
33380 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72  f the page is wr
33390 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e  itten into.** on
333a0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
333b0 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  s, the correspon
333c0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
333d0 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72  in the .** Pager
333e0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
333f0 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  ec and the Pager
33400 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
33410 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a  epoint bitvecs.*
33420 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61  * of any open sa
33430 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72  vepoints as appr
33440 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
33450 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
33460 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
33470 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
33480 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61  pPg->pData;.  Pa
33490 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
334a0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
334b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
334c0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
334d0 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  ine is not calle
334e0 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65  d unless a write
334f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
33500 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62   already .  ** b
33510 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65  een started. The
33520 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
33530 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
33540 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69  open at this poi
33550 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e  nt..  ** It is n
33560 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74  ever called in t
33570 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a  he ERROR state..
33580 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
33590 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
335a0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
335b0 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  ED.       || pPa
335c0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
335d0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
335e0 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
335f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33600 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
33610 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
33620 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
33630 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
33640 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  /* If an error h
33650 61 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  as been previous
33660 6c 79 20 64 65 74 65 63 74 65 64 2c 20 72 65 70  ly detected, rep
33670 6f 72 74 20 74 68 65 20 73 61 6d 65 20 65 72 72  ort the same err
33680 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 54  or.  ** again. T
33690 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68  his should not h
336a0 61 70 70 65 6e 2c 20 62 75 74 20 74 68 65 20 63  appen, but the c
336b0 68 65 63 6b 20 70 72 6f 76 69 64 65 73 20 72 6f  heck provides ro
336c0 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69  bustness. */.  i
336d0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
336e0 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72 65 74  >errCode) )  ret
336f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
33700 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65  ode;..  /* Highe
33710 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73  r-level routines
33720 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73   never call this
33730 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74   function if dat
33740 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a  abase is not.  *
33750 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74  * writable.  But
33760 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a   check anyway, j
33770 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  ust for robustne
33780 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ss. */.  if( NEV
33790 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  ER(pPager->readO
337a0 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53 51  nly) ) return SQ
337b0 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 43 48  LITE_PERM;..  CH
337c0 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
337d0 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
337e0 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
337f0 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72  e opened. Higher
33800 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20   level routines 
33810 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
33820 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e  * obtained the n
33830 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74  ecessary locks t
33840 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72 69 74  o begin the writ
33850 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  e-transaction, b
33860 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c  ut the.  ** roll
33870 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  back journal mig
33880 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70  ht not yet be op
33890 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20  en. Open it now 
338a0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  if this is the c
338b0 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ase..  **.  ** T
338c0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
338d0 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  re calling sqlit
338e0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
338f0 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  y() on the page.
33900 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
33910 2c 20 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e  , if it were don
33920 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20  e after calling 
33930 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
33940 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20  eDirty(), then. 
33950 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67   ** an error mig
33960 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65  ht occur and the
33970 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64   pager would end
33980 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f   up in WRITER_LO
33990 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20  CKED state.  ** 
339a0 77 69 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65  with pages marke
339b0 64 20 61 73 20 64 69 72 74 79 20 69 6e 20 74 68  d as dirty in th
339c0 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  e cache..  */.  
339d0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
339e0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
339f0 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72  _LOCKED ){.    r
33a00 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
33a10 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
33a20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33a30 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
33a40 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
33a50 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
33a60 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
33a70 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  CHEMOD );.  asse
33a80 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
33a90 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
33aa0 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
33ab0 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
33ac0 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
33ad0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
33ae0 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
33af0 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
33b00 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
33b10 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
33b20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
33b30 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
33b40 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  f( pageInJournal
33b50 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65  (pPg) && !subjRe
33b60 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
33b70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
33b80 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
33b90 65 72 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  er) );.  }else{.
33ba0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
33bb0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
33bc0 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
33bd0 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
33be0 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
33bf0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
33c00 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
33c10 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
33c20 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
33c30 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
33c40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
33c50 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
33c60 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
33c70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33c80 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70  !pageInJournal(p
33c90 50 67 29 20 26 26 20 21 70 61 67 65 72 55 73 65  Pg) && !pagerUse
33ca0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
33cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67       assert( pag
33cc0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
33cd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
33ce0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67   pPg->pgno<=pPag
33cf0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26  er->dbOrigSize &
33d00 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
33d10 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
33d20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
33d30 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
33d40 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f  ;.        i64 iO
33d50 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
33d60 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20  rnalOff;..      
33d70 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
33d80 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
33d90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
33da0 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
33db0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
33dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
33dd0 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
33de0 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
33df0 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ies.        ** t
33e00 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
33e10 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
33e20 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
33e30 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
33e40 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  r) );..        a
33e50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
33e60 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65  ournalHdr<=pPage
33e70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
33e80 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28  .        CODEC2(
33e90 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
33ea0 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
33eb0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
33ec0 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
33ed0 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
33ee0 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
33ef0 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20  u8*)pData2);..  
33f00 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66        /* Even if
33f10 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75   an IO or diskfu
33f20 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ll error occurs 
33f30 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  while journallin
33f40 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  g the.        **
33f50 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f   page in the blo
33f60 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68  ck above, set th
33f70 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67  e need-sync flag
33f80 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20   for the page.. 
33f90 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
33fa0 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
33fb0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
33fc0 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
33fd0 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  gic in.        *
33fe0 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
33ff0 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
34000 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
34010 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
34020 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
34030 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
34040 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
34050 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
34060 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
34070 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63         ** then c
34080 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
34090 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  llow..        */
340a0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  .        pPg->fl
340b0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
340c0 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20  D_SYNC;..       
340d0 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
340e0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
340f0 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
34100 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
34110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
34120 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
34130 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
34140 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
34150 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
34160 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b  >pageSize, iOff+
34170 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
34180 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
34190 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
341a0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
341b0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
341c0 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61   iOff+pPager->pa
341d0 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29  geSize+4, cksum)
341e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
341f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
34200 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
34210 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
34220 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
34230 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
34240 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
34250 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
34260 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67  journalOff, pPag
34270 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a  er->pageSize));.
34280 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
34290 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
342a0 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
342b0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
342c0 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE(("JOURNAL %d 
342d0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
342e0 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
342f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
34300 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
34310 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
34320 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
34330 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
34340 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61  D_SYNC)?1:0), pa
34350 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
34360 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 50  )));..        pP
34370 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
34380 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e   += 8 + pPager->
34390 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
343a0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
343b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
343c0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
343d0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
343e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
343f0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
34400 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
34410 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
34420 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
34430 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
34440 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
34450 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
34460 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
34470 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c   );.        rc |
34480 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
34490 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
344a0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
344b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
344c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
344d0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
344e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
344f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
34500 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
34510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34520 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
34530 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
34540 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20  TER_DBMOD ){.   
34550 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
34560 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
34570 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SYNC;.        }.
34580 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
34590 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
345a0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
345b0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
345c0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
345d0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
345e0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
345f0 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
34600 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
34610 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  1:0)));.      }.
34620 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
34630 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
34640 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
34650 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
34660 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
34670 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
34680 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
34690 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
346a0 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
346b0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
346c0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
346d0 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
346e0 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
346f0 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
34700 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
34710 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
34720 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
34730 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
34740 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
34750 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
34760 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
34770 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
34780 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
34790 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
347a0 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
347b0 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rn..  */.  if( p
347c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
347d0 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
347e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
347f0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20  pPg->pgno;.  }. 
34800 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34810 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
34820 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
34830 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  le. This routine
34840 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
34850 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e  before .** makin
34860 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  g changes to a p
34870 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  age. The caller 
34880 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
34890 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20  eturn value .** 
348a0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
348b0 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
348c0 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e  not to change an
348d0 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65  y page data unle
348e0 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ss .** this rout
348f0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
34900 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
34910 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
34920 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
34930 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74  n and pager_writ
34940 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
34950 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73  .** function als
34960 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65  o deals with the
34970 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
34980 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61  ere 2 or more pa
34990 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20  ges.** fit on a 
349a0 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
349b0 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
349c0 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74   all co-resident
349d0 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68   pages.** must h
349e0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
349f0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
34a00 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75  file before retu
34a10 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
34a20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
34a30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72   SQLITE_NOMEM or
34a40 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
34a50 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  e is returned.**
34a60 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
34a70 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
34a80 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
34a90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34aa0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29  DbPage *pDbPage)
34ab0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
34ac0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72  ITE_OK;..  PgHdr
34ad0 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
34ae0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
34af0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
34b00 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
34b10 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
34b20 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  >sectorSize/pPag
34b30 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
34b40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34b50 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
34b60 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
34b70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34b80 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
34b90 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
34ba0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
34bb0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
34bc0 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65  ;..  if( nPagePe
34bd0 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
34be0 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
34bf0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
34c00 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
34c10 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
34c20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
34c30 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
34c40 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
34c50 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
34c60 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
34c70 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
34c80 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20  nPage = 0;      
34c90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
34ca0 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
34cb0 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
34cc0 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
34cd0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
34ce0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
34cf0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
34d00 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20  needSync = 0;   
34d10 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
34d20 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47   any page has PG
34d30 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f  HDR_NEED_SYNC */
34d40 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
34d50 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20   doNotSyncSpill 
34d60 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20  flag to 1. This 
34d70 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61  is because we ca
34d80 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a  nnot allow.    *
34d90 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  * a journal head
34da0 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  er to be written
34db0 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67   between the pag
34dc0 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a  es journaled by.
34dd0 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63      ** this func
34de0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
34df0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
34e00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
34e10 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
34e20 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  Spill==0 );.    
34e30 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
34e40 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f  cSpill++;..    /
34e50 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
34e60 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
34e70 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
34e80 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
34e90 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
34ea0 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
34eb0 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
34ec0 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
34ed0 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
34ee0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
34ef0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
34f00 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
34f10 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
34f20 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
34f30 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
34f40 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
34f50 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50   nPageCount = pP
34f60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
34f70 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
34f80 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
34f90 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
34fa0 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
34fb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
34fc0 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
34fd0 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
34fe0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
34ff0 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
35000 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
35010 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
35020 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
35030 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
35040 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
35050 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
35060 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
35070 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
35080 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
35090 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
350a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
350b0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
350c0 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
350d0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
350e0 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
350f0 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
35100 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
35110 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
35120 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
35130 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
35140 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
35150 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
35160 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35170 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
35180 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
35190 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
351a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
351b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
351c0 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
351d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
351e0 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
351f0 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
35200 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64              need
35210 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
35220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35230 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
35240 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
35250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35260 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
35270 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
35280 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
35290 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
352a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
352b0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
352c0 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
352d0 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
352e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
352f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
35300 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
35310 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
35320 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f  /* If the PGHDR_
35330 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
35340 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
35350 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
35360 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
35370 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
35380 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
35390 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
353a0 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
353b0 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
353c0 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
353d0 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
353e0 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
353f0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
35400 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
35410 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
35420 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
35430 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
35440 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
35450 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
35460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35470 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
35480 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35490 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a   && needSync ){.
354a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d        assert( !M
354b0 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 66 6f  EMDB );.      fo
354c0 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
354d0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
354e0 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
354f0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
35500 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
35510 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
35520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
35530 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  ge->flags |= PGH
35540 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
35550 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
35560 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
35570 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35580 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
35590 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
355a0 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31  oNotSyncSpill==1
355b0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
355c0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d  doNotSyncSpill--
355d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
355e0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
355f0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
35600 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
35610 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
35620 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
35630 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
35640 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
35650 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
35660 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
35670 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
35680 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
35690 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
356a0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
356b0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
356c0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
356d0 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
356e0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
356f0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
35700 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67  return pPg->flag
35710 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d  s&PGHDR_DIRTY;.}
35720 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
35730 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
35740 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
35750 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
35760 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
35770 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
35780 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
35790 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74  ge pPg back to t
357a0 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
357b0 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
357c0 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
357d0 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69  d as dirty.  Thi
357e0 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
357f0 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20  xample, when.** 
35800 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
35810 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61  n added as a lea
35820 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
35830 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20  t and so its.** 
35840 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65  content no longe
35850 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  r matters..**.**
35860 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
35870 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
35880 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
35890 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
358a0 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
358b0 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
358c0 75 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20  used. The pager 
358d0 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
358e0 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
358f0 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
35900 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
35910 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
35920 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
35930 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
35940 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
35950 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a  eed of large .**
35960 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
35970 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
35980 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
35990 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
359a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
359b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
359c0 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
359d0 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20  PGHDR_DIRTY) && 
359e0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
359f0 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47  nt==0 ){.    PAG
35a00 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57  ERTRACE(("DONT_W
35a10 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
35a20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
35a30 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
35a40 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  )));.    IOTRACE
35a50 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
35a60 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
35a70 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e  pgno)).    pPg->
35a80 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44  flags |= PGHDR_D
35a90 4f 4e 54 5f 57 52 49 54 45 3b 0a 20 20 20 20 70  ONT_WRITE;.    p
35aa0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
35ab0 68 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  h(pPg);.  }.}../
35ac0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
35ad0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
35ae0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
35af0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
35b00 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e  se file .** chan
35b10 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72  ge-counter, stor
35b20 65 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62  ed as a 4-byte b
35b30 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
35b40 72 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a  r starting at .*
35b50 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  * byte offset 24
35b60 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
35b70 6c 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 61  le.  The seconda
35b80 72 79 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ry change counte
35b90 72 20 61 74 0a 2a 2a 20 39 32 20 69 73 20 61 6c  r at.** 92 is al
35ba0 73 6f 20 75 70 64 61 74 65 64 2c 20 61 73 20 69  so updated, as i
35bb0 73 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72  s the SQLite ver
35bc0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
35bd0 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
35be0 42 75 74 20 74 68 69 73 20 6f 6e 6c 79 20 68 61  But this only ha
35bf0 70 70 65 6e 73 20 69 66 20 74 68 65 20 70 50 61  ppens if the pPa
35c00 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
35c10 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 66 61 6c  Done flag is fal
35c20 73 65 2e 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  se..** To avoid 
35c30 65 78 63 65 73 73 20 63 68 75 72 6e 69 6e 67 20  excess churning 
35c40 6f 66 20 70 61 67 65 20 31 2c 20 74 68 65 20 75  of page 1, the u
35c50 70 64 61 74 65 20 6f 6e 6c 79 20 68 61 70 70 65  pdate only happe
35c60 6e 73 20 6f 6e 63 65 2e 0a 2a 2a 20 53 65 65 20  ns once..** See 
35c70 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 77  also the pager_w
35c80 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
35c90 65 72 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61  er() routine tha
35ca0 74 20 64 6f 65 73 20 61 6e 20 0a 2a 2a 20 75 6e  t does an .** un
35cb0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61  conditional upda
35cc0 74 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  te of the change
35cd0 20 63 6f 75 6e 74 65 72 73 2e 0a 2a 2a 0a 2a 2a   counters..**.**
35ce0 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74   If the isDirect
35cf0 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72  Mode flag is zer
35d00 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
35d10 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
35d20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
35d30 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20  Write() on page 
35d40 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e  1, then modifyin
35d50 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
35d60 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  f the.** page da
35d70 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ta. In this case
35d80 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   the file will b
35d90 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74  e updated when t
35da0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
35db0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
35dc0 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
35dd0 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
35de0 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  lag may only be 
35df0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
35e00 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
35e10 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  iled.** with the
35e20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
35e30 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72  TOMIC_WRITE macr
35e40 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68  o defined. In th
35e50 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69  is case,.** if i
35e60 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a  sDirect is non-z
35e70 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61  ero, then the da
35e80 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
35e90 70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a  pdated directly.
35ea0 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e  ** by writing an
35eb0 20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e   updated version
35ec0 20 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67   of page 1 using
35ed0 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a   a call to the .
35ee0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  ** sqlite3OsWrit
35ef0 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  e() function..*/
35f00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
35f10 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
35f20 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
35f30 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
35f40 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Mode){.  int rc 
35f50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
35f60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35f70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
35f80 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
35f90 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
35fa0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
35fb0 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
35fc0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
35fd0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
35fe0 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  ger) );..  /* De
35ff0 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61  clare and initia
36000 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e  lize constant in
36010 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27  teger 'isDirect'
36020 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74  . If the.  ** at
36030 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
36040 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  ization is enabl
36050 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
36060 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a  , then isDirect.
36070 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69    ** is initiali
36080 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
36090 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69   passed as the i
360a0 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61  sDirectMode para
360b0 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68  meter.  ** to th
360c0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68  is function. Oth
360d0 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c  erwise, it is al
360e0 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
360f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
36100 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20  idea is that if 
36110 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
36120 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
36130 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65   not.  ** enable
36140 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
36150 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  e, the compiler 
36160 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73  can omit the tes
36170 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69  ts of.  ** 'isDi
36180 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20  rect' below, as 
36190 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63  well as the bloc
361a0 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68  k enclosed in th
361b0 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69  e.  ** "if( isDi
361c0 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f  rect )" conditio
361d0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
361e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
361f0 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66  OMIC_WRITE.# def
36200 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
36210 30 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69  0.  assert( isDi
36220 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20  rectMode==0 );. 
36230 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
36240 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b  R(isDirectMode);
36250 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
36260 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69  DIRECT_MODE isDi
36270 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a  rectMode.#endif.
36280 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
36290 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
362a0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
362b0 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  e>0 ){.    PgHdr
362c0 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20   *pPgHdr;       
362d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
362e0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
362f0 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
36300 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
36310 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  e && isOpen(pPag
36320 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20  er->fd) );..    
36330 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
36340 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
36350 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
36360 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
36370 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
36380 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73  pPgHdr);.    ass
36390 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c  ert( pPgHdr==0 |
363a0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
363b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61  );..    /* If pa
363c0 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68  ge one was fetch
363d0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
363e0 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
363f0 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a  on is not.    **
36400 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69   operating in di
36410 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20  rect-mode, make 
36420 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e  page 1 writable.
36430 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20    When not in . 
36440 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64     ** direct mod
36450 65 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c 77  e, page 1 is alw
36460 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68  ays held in cach
36470 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  e and hence the 
36480 50 61 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a  PagerGet().    *
36490 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79  * above is alway
364a0 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68  s successful - h
364b0 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53 20  ence the ALWAYS 
364c0 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  on rc==SQLITE_OK
364d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
364e0 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26   !DIRECT_MODE &&
364f0 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49   ALWAYS(rc==SQLI
36500 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
36510 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36520 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a  rWrite(pPgHdr);.
36530 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
36540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36550 20 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 6c        /* Actuall
36560 79 20 64 6f 20 74 68 65 20 75 70 64 61 74 65 20  y do the update 
36570 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  of the change co
36580 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  unter */.      p
36590 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
365a0 65 63 6f 75 6e 74 65 72 28 70 50 67 48 64 72 29  ecounter(pPgHdr)
365b0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ;..      /* If r
365c0 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74  unning in direct
365d0 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65   mode, write the
365e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
365f0 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  e 1 to the file.
36600 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49   */.      if( DI
36610 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20  RECT_MODE ){.   
36620 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
36630 2a 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20 61  *zBuf;.        a
36640 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
36650 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20  bFileSize>0 );. 
36660 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
36670 61 67 65 72 2c 20 70 50 67 48 64 72 2d 3e 70 44  ager, pPgHdr->pD
36680 61 74 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51  ata, 1, 6, rc=SQ
36690 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66  LITE_NOMEM, zBuf
366a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
366b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
366c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
366d0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
366e0 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
366f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
36700 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
36710 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
36720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36730 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
36740 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
36750 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
36760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36770 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
36780 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
36790 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
367a0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
367b0 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
367c0 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
367d0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
367e0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
367f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
36800 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
36810 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68  file to disk. Th
36820 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  is is a no-op fo
36830 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
36840 62 61 73 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65  bases.** or page
36850 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  s with the Pager
36860 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74  .noSync flag set
36870 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
36880 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 63 61 6c  ssful, or if cal
36890 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66  led on a pager f
368a0 6f 72 20 77 68 69 63 68 20 69 74 20 69 73 20 61  or which it is a
368b0 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20   no-op, this.** 
368c0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
368d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
368e0 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72  rwise, an IO err
368f0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
36900 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
36910 74 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67  te3PagerSync(Pag
36920 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
36930 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
36940 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
36950 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
36960 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
36970 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
36980 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
36990 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
369a0 63 46 6c 61 67 73 29 3b 0a 20 20 7d 65 6c 73 65  cFlags);.  }else
369b0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
369c0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
369d0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
369e0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
369f0 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
36a00 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
36a10 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44 2c  TL_SYNC_OMITTED,
36a20 20 28 76 6f 69 64 20 2a 29 26 72 63 29 3b 0a 20   (void *)&rc);. 
36a30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
36a40 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
36a50 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
36a60 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20  be called while 
36a70 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
36a80 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 69 6e  ion is active in
36a90 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66  .** rollback. If
36aa0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
36ab0 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20  is in WAL mode, 
36ac0 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
36ad0 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  o-op. .** Otherw
36ae0 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e  ise, if the conn
36af0 65 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ection does not 
36b00 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 6e 20  already have an 
36b10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
36b20 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  n .** the databa
36b30 73 65 20 66 69 6c 65 2c 20 61 6e 20 61 74 74 65  se file, an atte
36b40 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
36b50 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  btain one..**.**
36b60 20 49 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   If the EXCLUSIV
36b70 45 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  E lock is alread
36b80 79 20 68 65 6c 64 20 6f 72 20 74 68 65 20 61 74  y held or the at
36b90 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
36ba0 69 74 20 69 73 0a 2a 2a 20 73 75 63 63 65 73 73  it is.** success
36bb0 66 75 6c 2c 20 6f 72 20 74 68 65 20 63 6f 6e 6e  ful, or the conn
36bc0 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c  ection is in WAL
36bd0 20 6d 6f 64 65 2c 20 53 51 4c 49 54 45 5f 4f 4b   mode, SQLITE_OK
36be0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
36bf0 20 4f 74 68 65 72 77 69 73 65 2c 20 65 69 74 68   Otherwise, eith
36c00 65 72 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  er SQLITE_BUSY o
36c10 72 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  r an SQLITE_IOER
36c20 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
36c30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
36c40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36c50 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
36c60 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
36c70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
36c80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
36c90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
36ca0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36cb0 43 41 43 48 45 4d 4f 44 20 0a 20 20 20 20 20 20  CACHEMOD .      
36cc0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
36cd0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
36ce0 5f 44 42 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c  _DBMOD .       |
36cf0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36d00 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
36d10 4f 43 4b 45 44 20 0a 20 20 29 3b 0a 20 20 61 73  OCKED .  );.  as
36d20 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
36d30 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
36d40 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 70 61 67   );.  if( 0==pag
36d50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
36d60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
36d70 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
36d80 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
36d90 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72  E_LOCK);.  }.  r
36da0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
36db0 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
36dc0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
36dd0 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
36de0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
36df0 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
36e00 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
36e10 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
36e20 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
36e30 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
36e40 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
36e50 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
36e60 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
36e70 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
36e80 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
36e90 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
36ea0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
36eb0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
36ec0 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
36ed0 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
36ee0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
36ef0 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
36f00 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  r is updated,.**
36f10 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c     * the journal
36f20 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65   is synced (unle
36f30 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ss the atomic-wr
36f40 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
36f50 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20   is used),.**   
36f60 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  * all dirty page
36f70 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f  s are written to
36f80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36f90 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20  le, .**   * the 
36fa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
36fb0 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72   truncated (if r
36fc0 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a  equired), and.**
36fd0 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
36fe0 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a  e file synced. .
36ff0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  **.** The only t
37000 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e  hing that remain
37010 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
37020 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
37030 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28  o finalize .** (
37040 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65  delete, truncate
37050 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72   or zero the fir
37060 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20  st part of) the 
37070 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
37080 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
37090 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
370a0 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
370b0 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
370c0 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
370d0 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
370e0 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
370f0 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
37100 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
37110 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
37120 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
37130 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
37140 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20  nal parameter - 
37150 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65  noSync - is true
37160 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
37170 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a  ase file itself.
37180 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64  ** is not synced
37190 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
371a0 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  t call sqlite3Pa
371b0 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74  gerSync() direct
371c0 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68  ly to.** sync th
371d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
371e0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43  before calling C
371f0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
37200 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  to delete the.**
37210 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
37220 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69   this case..*/.i
37230 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
37240 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20  ommitPhaseOne(. 
37250 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
37260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37270 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
37280 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
37290 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20   *zMaster,      
372a0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
372b0 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72  NULL, the master
372c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
372d0 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20  .  int noSync   
372e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
372f0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
37300 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20  it the xSync on 
37310 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29  the db file */.)
37320 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
37330 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
37340 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
37350 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
37360 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37370 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
37380 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
37390 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
373a0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
373b0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
373c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
373d0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
373e0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
373f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37400 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 20 20 61  R_ERROR.  );.  a
37410 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
37420 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37430 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20  ) );..  /* If a 
37440 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63 63 75  prior error occu
37450 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74 68 61  rred, report tha
37460 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e 20 2a  t error again. *
37470 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
37480 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
37490 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
374a0 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45  errCode;..  PAGE
374b0 52 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53  RTRACE(("DATABAS
374c0 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
374d0 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65  zMaster=%s nSize
374e0 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
374f0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
37500 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
37510 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20  r->dbSize));..  
37520 2f 2a 20 49 66 20 6e 6f 20 64 61 74 61 62 61 73  /* If no databas
37530 65 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  e changes have b
37540 65 65 6e 20 6d 61 64 65 2c 20 72 65 74 75 72 6e  een made, return
37550 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28   early. */.  if(
37560 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
37570 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
37580 48 45 4d 4f 44 20 29 20 72 65 74 75 72 6e 20 53  HEMOD ) return S
37590 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
375a0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 2f 2a   MEMDB ){.    /*
375b0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
375c0 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
375d0 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
375e0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
375f0 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 75  r this.    ** fu
37600 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
37610 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
37620 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20 6e  it is mostly a n
37630 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c 20  o-op.  However, 
37640 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b 75  any.    ** backu
37650 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e 65  p in progress ne
37660 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 61 72  eds to be restar
37670 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
37680 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
37690 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
376a0 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ckup);.  }else{.
376b0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
376c0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
376d0 20 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73       PgHdr *pLis
376e0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
376f0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
37700 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
37710 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
37720 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
37730 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
37740 65 72 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65  er, pList, pPage
37750 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20  r->dbSize, 1, . 
37760 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
37770 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70  er->fullSync ? p
37780 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
37790 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b   : 0).        );
377a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
377b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
377c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
377d0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
377e0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
377f0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
37800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
37810 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
37820 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65 20  ock updates the 
37830 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
37840 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20  Exactly how it. 
37850 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69       ** does thi
37860 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  s depends on whe
37870 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
37880 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70  atomic-update op
37890 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  timization.     
378a0 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20   ** was enabled 
378b0 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
378c0 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61   and if this tra
378d0 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74  nsaction meets t
378e0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e  he .      ** run
378f0 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f  time criteria to
37900 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69   use the operati
37910 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  on: .      **.  
37920 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20      **    * The 
37930 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
37940 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  orts the atomic-
37950 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66  write property f
37960 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  or.      **     
37970 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20   blocks of size 
37980 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a  page-size, and .
37990 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68        **    * Th
379a0 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74  is commit is not
379b0 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
379c0 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  -file transactio
379d0 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  n, and.      ** 
379e0 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65     * Exactly one
379f0 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d   page has been m
37a00 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72  odified and stor
37a10 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
37a20 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
37a30 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
37a40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73  optimization was
37a50 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20   not enabled at 
37a60 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
37a70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
37a80 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
37a90 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74  ecounter() funct
37aa0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
37ab0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
37ac0 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e  ge.      ** coun
37ad0 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74  ter in 'indirect
37ae0 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f  -mode'. If the o
37af0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63  ptimization is c
37b00 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20  ompiled in but. 
37b10 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
37b20 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69  pplicable to thi
37b30 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  s transaction, c
37b40 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  all sqlite3Journ
37b50 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 20  alCreate().     
37b60 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65   ** to make sure
37b70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37b80 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62  e has actually b
37b90 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65  een created, the
37ba0 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  n call.      ** 
37bb0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
37bc0 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70  ecounter() to up
37bd0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
37be0 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72  counter in indir
37bf0 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  ect.      ** mod
37c00 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  e. .      **.   
37c10 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
37c20 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   if the optimiza
37c30 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61  tion is both ena
37c40 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61  bled and applica
37c50 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ble,.      ** th
37c60 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e  en call pager_in
37c70 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
37c80 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  () to update the
37c90 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a   change-counter.
37ca0 20 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72        ** in 'dir
37cb0 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68  ect' mode. In th
37cc0 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
37cd0 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65  nal file will ne
37ce0 76 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ver be.      ** 
37cf0 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
37d00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
37d10 20 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66 20      */.  #ifdef 
37d20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
37d30 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
37d40 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
37d50 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
37d60 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a  n(pPager->jfd) .
37d70 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
37d80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
37d90 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
37da0 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
37db0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
37dc0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
37dd0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
37de0 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
37df0 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
37e00 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
37e10 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 26  ->jfd) .       &
37e20 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
37e30 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72  lOff==jrnlBuffer
37e40 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20  Size(pPager) .  
37e50 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
37e60 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e  dbSize>=pPager->
37e70 64 62 4f 72 69 67 53 69 7a 65 0a 20 20 20 20 20  dbOrigSize.     
37e80 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20    && (0==(pPg = 
37e90 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
37ea0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
37eb0 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70  PCache)) || 0==p
37ec0 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20  Pg->pDirty).    
37ed0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
37ee0 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69  Update the db fi
37ef0 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  le change counte
37f00 72 20 76 69 61 20 74 68 65 20 64 69 72 65 63 74  r via the direct
37f10 2d 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54  -write method. T
37f20 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  he .        ** f
37f30 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69  ollowing call wi
37f40 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65 20 69 6e  ll modify the in
37f50 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
37f60 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  tation of page 1
37f70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
37f80 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61  include the upda
37f90 74 65 64 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ted change count
37fa0 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74  er and then writ
37fb0 65 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  e page 1 .      
37fc0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
37fd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37fe0 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74  le. Because of t
37ff0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
38000 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 70  .        ** prop
38010 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74  erty of the host
38020 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
38030 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
38040 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
38050 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
38060 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
38070 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ger, 1);.      }
38080 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
38090 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
380a0 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  lCreate(pPager->
380b0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jfd);.        if
380c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
380d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
380e0 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
380f0 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
38100 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  r, 0);.        }
38110 0a 20 20 20 20 20 20 7d 0a 20 20 23 65 6c 73 65  .      }.  #else
38120 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
38130 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
38140 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b  nter(pPager, 0);
38150 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20  .  #endif.      
38160 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
38170 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
38180 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
38190 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74    .      /* If t
381a0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
381b0 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74  has made the dat
381c0 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74  abase smaller, t
381d0 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20  hen all pages.  
381e0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
381f0 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
38200 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
38210 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
38220 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
38230 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20   file. This can 
38240 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61  only happen in a
38250 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e  uto-vacuum mode.
38260 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
38270 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e  ** Before readin
38280 67 20 74 68 65 20 70 61 67 65 73 20 77 69 74 68  g the pages with
38290 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61   page numbers la
382a0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
382b0 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
382c0 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
382d0 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a  bSize, set dbSiz
382e0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
382f0 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  lue.      ** tha
38300 74 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65  t it took at the
38310 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
38320 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72  ansaction. Other
38330 77 69 73 65 2c 20 74 68 65 0a 20 20 20 20 20 20  wise, the.      
38340 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
38350 74 65 33 50 61 67 65 72 47 65 74 28 29 20 72 65  te3PagerGet() re
38360 74 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67 65  turn zeroed page
38370 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 20 20  s instead of .  
38380 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 64      ** reading d
38390 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
383a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
383b0 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65 66 20 53    */.  #ifndef S
383c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
383d0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
383e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
383f0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
38400 65 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  e .       && pPa
38410 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
38420 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
38430 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20 20 29 7b  ODE_OFF.      ){
38440 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b  .        Pgno i;
38450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38470 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
38480 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
38490 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53     const Pgno iS
384a0 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50  kip = PAGER_MJ_P
384b0 47 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20  GNO(pPager); /* 
384c0 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67  Pending lock pag
384d0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  e */.        con
384e0 73 74 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d  st Pgno dbSize =
384f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
38500 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
38510 73 65 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f  se image size */
38520 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
38530 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
38540 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
38550 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62         for( i=db
38560 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65  Size+1; i<=pPage
38570 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69  r->dbOrigSize; i
38580 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
38590 69 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76  if( !sqlite3Bitv
385a0 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
385b0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26  InJournal, i) &&
385c0 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
385d0 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a           PgHdr *
385e0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
385f0 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f     /* Page to jo
38600 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20  urnal */.       
38610 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
38620 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
38630 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , i, &pPage);.  
38640 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
38650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
38660 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
38670 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
38680 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
38690 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
386a0 67 65 29 3b