/ Hex Artifact Content
Login

Artifact c9f22eb831851220c1095863c5797a88f71bea8a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76 65      0x01 /* Neve
52b0: 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20 20  r spill cache.  
52c0: 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20 2a  Set via pragma *
52d0: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
52e0: 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 20  LAG_ROLLBACK    
52f0: 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74 20  0x02 /* Current 
5300: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73 6f  rolling back, so
5310: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a 2f   do not spill */
5320: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
5330: 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20 30  AG_NOSYNC      0
5340: 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20  x04 /* Spill is 
5350: 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ok, but do not s
5360: 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ync */../*.** An
5370: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5380: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5390: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
53a0: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
53b0: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
53c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
53d0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
53e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
53f0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
5400: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
5410: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
5420: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5430: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5440: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5450: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5460: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5470: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5480: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5490: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
54a0: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
54b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
54c0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
54d0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
54e0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
54f0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
5500: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
5510: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
5520: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5530: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5540: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5550: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5560: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5570: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5580: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
55a0: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
55b0: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
55c0: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
55d0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
55e0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
55f0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
5600: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
5610: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
5620: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5630: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5640: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5650: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5660: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5670: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5680: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5690: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
56a0: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
56b0: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
56c0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
56d0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
56e0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
56f0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
5700: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
5710: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
5720: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5730: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5740: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5750: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5760: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5770: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5780: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5790: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
57a0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
57b0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
57c0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
57d0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
57e0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
57f0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
5800: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5810: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
5820: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5830: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5840: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5850: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5870: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5880: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5890: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
58a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
58b0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
58c0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
58d0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
58e0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
58f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
5900: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
5910: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
5920: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5930: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5940: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5950: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5960: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5970: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5980: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5990: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
59a0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
59b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
59c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
59d0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
59e0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
59f0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
5a00: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
5a10: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
5a20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5a30: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5a40: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5a50: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5a60: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5a70: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5a80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5a90: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5aa0: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5ab0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5ac0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
5ad0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
5ae0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
5af0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
5b00: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
5b10: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
5b20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5b30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5b40: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b50: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5b60: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5b70: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5b80: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5b90: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5ba0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5bb0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5bc0: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5bd0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5be0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5bf0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5c10: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5c30: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5c40: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5c50: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c60: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5c70: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5c80: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5c90: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5cb0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5cc0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5cd0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5ce0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5cf0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5d00: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5d10: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5d20: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5d30: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5d40: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5d50: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5d60: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5d70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5d80: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5d90: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5da0: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5db0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5dc0: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5dd0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5de0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5df0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5e00: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5e10: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5e20: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5e30: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5e40: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5e50: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5e60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5e80: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5e90: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5ea0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5eb0: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5ec0: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5ed0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5ee0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5ef0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5f00: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5f20: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5f30: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5f40: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5f50: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5f60: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5f70: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5f80: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5f90: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5fa0: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ill.**.**   This
5fb0: 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72   variables contr
5fc0: 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ol the behavior 
5fd0: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20  of cache-spills 
5fe0: 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a   (calls made by.
5ff0: 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20  **   the pcache 
6000: 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61  module to the pa
6010: 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74  gerStress() rout
6020: 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63  ine to write cac
6030: 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f  hed data.**   to
6040: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6050: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65   in order to fre
6060: 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a  e up memory)..**
6070: 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20  .**   When bits 
6080: 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72  SPILLFLAG_OFF or
6090: 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
60a0: 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c  ACK of doNotSpil
60b0: 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20  l are set,.**   
60c0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
60d0: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
60e0: 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69  erStress() is di
60f0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
6100: 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c  r..**   The SPIL
6110: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63  LFLAG_ROLLBACK c
6120: 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61  ase is done in a
6130: 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61   very obscure ca
6140: 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d  se that.**   com
6150: 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76  es up during sav
6160: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
6170: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
6180: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a  e pcache module.
6190: 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65  **   to allocate
61a0: 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70   a new page to p
61b0: 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e  revent the journ
61c0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
61d0: 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  ng written.**   
61e0: 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e  while it is bein
61f0: 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63  g traversed by c
6200: 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61  ode in pager_pla
6210: 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50  yback().  The SP
6220: 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20  ILLFLAG_OFF.**  
6230: 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20   case is a user 
6240: 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a  preference..** .
6250: 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c  **   If the SPIL
6260: 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74  LFLAG_NOSYNC bit
6270: 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67   is set, writing
6280: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6290: 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65 72   from.**   pager
62a0: 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72 6d  Stress() is perm
62b0: 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69  itted, but synci
62c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
62d0: 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20 20  ile is not..**  
62e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
62f0: 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
6300: 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68  rWrite() when th
6310: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  e file-system se
6320: 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20 69  ctor-size.**   i
6330: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6340: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  e database page-
6350: 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  size in order to
6360: 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e   prevent a journ
6370: 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72 6f  al sync.**   fro
6380: 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20 62  m happening in b
6390: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63a0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63b0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63c0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63d0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63e0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
63f0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6400: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6410: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6420: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6430: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6440: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6450: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6460: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6470: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6480: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
6490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64a0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64b0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64c0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64d0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64e0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
64f0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6500: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6510: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6520: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6530: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6540: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6550: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6560: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6580: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
6590: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65a0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65b0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65c0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65d0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65e0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
65f0: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6600: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6620: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6630: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6640: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6650: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6660: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6670: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6680: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
6690: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66a0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66b0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66c0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66d0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66e0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
66f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6700: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6710: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6720: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6730: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6740: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6750: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6760: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6770: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6780: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
6790: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67b0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67c0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67d0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67e0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
67f0: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6800: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6810: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6820: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6830: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6840: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6850: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6860: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6870: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6880: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
6890: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68a0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68b0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68c0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68d0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68e0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
68f0: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6900: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6910: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6920: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6930: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6940: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6950: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6960: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6970: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6980: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
6990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69a0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69b0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69c0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
69f0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a00: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a10: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a20: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a40: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a50: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a60: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a70: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a80: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6a90: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6aa0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ab0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ac0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ad0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6ae0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6af0: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b00: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b20: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b30: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b40: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b60: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b70: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b80: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6b90: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6ba0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bc0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6bd0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6be0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6bf0: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c00: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c10: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c20: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c30: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c40: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c50: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c60: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c70: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c80: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6c90: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6ca0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cb0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cc0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6cd0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6ce0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6cf0: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d00: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d10: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d30: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d40: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d60: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d70: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d80: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6d90: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6da0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6db0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dc0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6dd0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6de0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6df0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e00: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e10: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e20: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e30: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e60: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e70: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e80: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6e90: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6ea0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6eb0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ec0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ed0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ee0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6ef0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f00: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f10: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f20: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f30: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f40: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f50: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f60: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f80: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6f90: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fa0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fb0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fc0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fd0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6fe0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
6ff0: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7000: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7010: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7020: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7030: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7040: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7050: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7060: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7070: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7080: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
7090: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70a0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70b0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70c0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70d0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70e0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
70f0: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7100: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7110: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7120: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7130: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7140: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7150: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7160: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7170: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7180: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
7190: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71a0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71b0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71c0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71d0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
71f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7200: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7210: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7240: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7250: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7260: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7270: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7280: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7290: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
72f0: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7310: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7320: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7330: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7340: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7350: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7360: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7370: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7380: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73a0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73b0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73c0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
73f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7400: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7420: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7430: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7440: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7450: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7460: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
7490: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74a0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74d0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74e0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7540: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7550: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7560: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7570: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7580: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
7590: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75a0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75b0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75c0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75d0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75e0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
75f0: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7600: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7610: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7620: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7630: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7640: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7650: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7670: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7680: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7690: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76a0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76b0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76c0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76d0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76e0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
76f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7700: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7710: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7740: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7750: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7760: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7790: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77b0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77d0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77e0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
77f0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7800: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7820: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7830: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7840: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7850: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7860: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7870: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7880: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7890: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78b0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78c0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78d0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78e0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
78f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7900: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7910: 0a 20 20 75 38 20 68 61 73 42 65 65 6e 55 73 65  .  u8 hasBeenUse
7920: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
7930: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 63 6f  * True if any co
7940: 6e 74 65 6e 74 20 70 72 65 76 69 6f 75 73 6c 79  ntent previously
7950: 20 72 65 61 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   read */.  Pgno 
7960: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7970: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7980: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7990: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
79a0: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
79b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
79c0: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
79d0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
79e0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
79f0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7a00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7a10: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7a20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7a30: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7a40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7a50: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7a60: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7a70: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7a80: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7a90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7aa0: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7ab0: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7ac0: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7ae0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7af0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7b00: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7b10: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7b30: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7b40: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7b50: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7b60: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7b80: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7b90: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7ba0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7bb0: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7bc0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7bd0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7be0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7bf0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7c00: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7c10: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7c20: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7c30: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7c40: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7c50: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7c60: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7c70: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7c80: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7c90: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7ca0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7cb0: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7cc0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7cd0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7ce0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7cf0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7d00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7d10: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d30: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
7d40: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
7d50: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
7d60: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
7d70: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
7d80: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
7d90: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
7da0: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
7db0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
7dc0: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
7dd0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
7de0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
7df0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
7e00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7e10: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
7e20: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
7e30: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
7e40: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
7e50: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
7e60: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
7e70: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
7e80: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
7e90: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
7ec0: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
7ed0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
7ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7ef0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
7f00: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
7f10: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
7f20: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
7f30: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
7f40: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
7f50: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
7f60: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
7f70: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
7f80: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
7f90: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
7fa0: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
7fb0: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
7fc0: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
7fd0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
7fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8020: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8030: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8040: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8050: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8060: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8070: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8080: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8090: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
80a0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
80b0: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
80c0: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
80d0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
80e0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
80f0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
8100: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
8110: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
8120: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8130: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8140: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8150: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8180: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8190: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81b0: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
81c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
81d0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
81e0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
81f0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
8200: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
8210: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
8220: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8230: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8240: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8250: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8260: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8270: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8280: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8290: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
82a0: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
82b0: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
82c0: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
82d0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
82e0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
82f0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
8300: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
8310: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
8320: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8330: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8340: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8350: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8360: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8370: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8380: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83a0: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
83b0: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
83c0: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
83d0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
83e0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
83f0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
8400: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
8410: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
8420: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
8430: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
8440: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8450: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
8460: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
8470: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
8480: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
8490: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
84a0: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
84b0: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
84c0: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
84d0: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
84e0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
84f0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
8500: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8520: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
8530: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
8540: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8550: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
8560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8570: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
8580: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
8590: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
85a0: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
85c0: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
85d0: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
85e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
85f0: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
8600: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8610: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
8620: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
8630: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
8640: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8650: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8660: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
8670: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
8680: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  log */.#endif.};
8690: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20  ../*.** Indexes 
86a0: 66 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67  for use with Pag
86b0: 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20  er.aStat[]. The 
86c0: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72  Pager.aStat[] ar
86d0: 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ray contains.** 
86e0: 74 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73  the values acces
86f0: 73 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53  sed by passing S
8700: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
8710: 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f  ACHE_HIT, CACHE_
8720: 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48  MISS .** or CACH
8730: 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74  E_WRITE to sqlit
8740: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a  e3_db_status()..
8750: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
8760: 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64  _STAT_HIT   0.#d
8770: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
8780: 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65  _MISS  1.#define
8790: 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54   PAGER_STAT_WRIT
87a0: 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  E 2../*.** The f
87b0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
87c0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
87d0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
87e0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
87f0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
8800: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
8810: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
8820: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
8830: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
8840: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
8850: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
8860: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
8870: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
8880: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
8890: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
88a0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
88b0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
88c0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
88d0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
88e0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
88f0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
8900: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
8910: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8920: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
8930: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8940: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
8950: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
8960: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8970: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
8980: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8990: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
89a0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
89b0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
89c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
89d0: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
89e0: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
89f0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
8a00: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
8a10: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
8a20: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
8a30: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
8a40: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
8a50: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
8a60: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
8a70: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
8a80: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
8a90: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
8aa0: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
8ab0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
8ac0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
8ad0: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
8ae0: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
8af0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
8b00: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
8b10: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
8b20: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
8b30: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
8b40: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
8b50: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
8b60: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
8b70: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
8b80: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
8b90: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
8ba0: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
8bb0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
8bc0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
8bd0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
8be0: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
8bf0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
8c00: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
8c10: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
8c20: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
8c30: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
8c40: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
8c50: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
8c60: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
8c70: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
8c80: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
8c90: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
8ca0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
8cb0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
8cc0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
8cd0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
8ce0: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
8cf0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
8d00: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
8d10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
8d20: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
8d30: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
8d40: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
8d50: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
8d60: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
8d70: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
8d80: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
8d90: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
8da0: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
8db0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
8dc0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
8dd0: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
8de0: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
8df0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
8e00: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
8e10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
8e20: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
8e30: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
8e40: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
8e50: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
8e60: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
8e70: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
8e80: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
8e90: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
8ea0: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
8eb0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
8ec0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8ed0: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
8ee0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
8ef0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
8f00: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
8f10: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
8f20: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8f30: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
8f40: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
8f50: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
8f60: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
8f70: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
8f80: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
8f90: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
8fa0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
8fb0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
8fc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
8fd0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
8fe0: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
8ff0: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
9000: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
9010: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
9020: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
9030: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
9040: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
9050: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
9060: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
9070: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
9080: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
9090: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
90a0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
90b0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
90c0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
90d0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
90e0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
90f0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
9100: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
9110: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
9120: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
9130: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
9140: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
9150: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
9160: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
9170: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
9180: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
9190: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
91a0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
91b0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
91c0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
91d0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
91e0: 55 53 45 46 45 54 43 48 20 69 73 20 74 72 75 65  USEFETCH is true
91f0: 20 69 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77   if we are allow
9200: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 78 46  ed to use the xF
9210: 65 74 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63  etch and xUnfetc
9220: 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20  h.** interfaces 
9230: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
9240: 74 61 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d  tabase using mem
9250: 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a  ory-mapped I/O..
9260: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
9270: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20  X_MMAP_SIZE>0.# 
9280: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9290: 78 29 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74  x) ((x)->bUseFet
92a0: 63 68 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ch).#else.# defi
92b0: 6e 65 20 55 53 45 46 45 54 43 48 28 78 29 20 30  ne USEFETCH(x) 0
92c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
92d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
92e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
92f0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
9300: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
9310: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
9320: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
9330: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63  ment to this mac
9340: 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73  ro is a file des
9350: 63 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71  criptor (type sq
9360: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a  lite3_file*)..**
9370: 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20   Return 0 if it 
9380: 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
9390: 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f  non-zero (but no
93a0: 74 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a  t 1) if it is..*
93b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20  *.** This is so 
93c0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73  that expressions
93d0: 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
93e0: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  as:.**.**   if( 
93f0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
9400: 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  fd) ){ ....**.**
9410: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a   instead of.**.*
9420: 2a 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  *   if( pPager->
9430: 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  jfd->pMethods ){
9440: 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   ....*/.#define 
9450: 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46  isOpen(pFd) ((pF
9460: 64 29 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29  d)->pMethods!=0)
9470: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9480: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
9490: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
94a0: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
94b0: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
94c0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
94d0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
94e0: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
94f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73  QLITE_OMIT_WAL.s
9500: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
9510: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
9520: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ger){.  return (
9530: 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29  pPager->pWal!=0)
9540: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
9550: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
9560: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9570: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
9580: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9590: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
95a0: 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  ,y) 0.# define p
95b0: 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
95c0: 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  sent(z) SQLITE_O
95d0: 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  K.# define pager
95e0: 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
95f0: 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f  tion(z) SQLITE_O
9600: 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
9610: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
9620: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
9630: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
9640: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
9650: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ) );.**.** This 
9660: 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61  function runs ma
9670: 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72  ny asserts to tr
9680: 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73  y to find incons
9690: 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20  istencies in.** 
96a0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
96b0: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
96c0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
96d0: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
96e0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
96f0: 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  p){.  Pager *pPa
9700: 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53  ger = p;..  /* S
9710: 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c  tate must be val
9720: 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  id. */.  assert(
9730: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9740: 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c  R_OPEN.       ||
9750: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9760: 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20  R_READER.       
9770: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9780: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9790: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
97a0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
97b0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
97c0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
97d0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
97e0: 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
97f0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9800: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a  WRITER_FINISHED.
9810: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9820: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
9830: 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61  .  );..  /* Rega
9840: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75  rdless of the cu
9850: 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74  rrent state, a t
9860: 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74  emp-file connect
9870: 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76  ion always behav
9880: 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74  es.  ** as if it
9890: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
98a0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
98b0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
98c0: 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20  never updates.  
98d0: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ** the change-co
98e0: 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20  unter field, so 
98f0: 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
9900: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
9910: 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  ys set..  */.  a
9920: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9930: 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63  le==0 || p->eLoc
9940: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
9950: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9960: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9970: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9980: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f  ountDone );..  /
9990: 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72  * If the useJour
99a0: 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nal flag is clea
99b0: 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  r, the journal-m
99c0: 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46  ode must be "OFF
99d0: 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  ". .  ** And if 
99e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
99f0: 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a   is "OFF", the j
9a00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9a10: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   not be open..  
9a20: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9a30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9a40: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9a50: 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72  FF || p->useJour
9a60: 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
9a70: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21   p->journalMode!
9a80: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9a90: 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65  DE_OFF || !isOpe
9aa0: 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  n(p->jfd) );..  
9ab0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45  /* Check that ME
9ac0: 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79  MDB implies noSy
9ad0: 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65  nc. And an in-me
9ae0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  mory journal. Si
9af0: 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d  nce .  ** this m
9b00: 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eans an in-memor
9b10: 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73  y pager performs
9b20: 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69   no IO at all, i
9b30: 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74  t cannot encount
9b40: 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  er .  ** either 
9b50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
9b60: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69  SQLITE_FULL duri
9b70: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77  ng rollback or w
9b80: 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20  hile finalizing 
9b90: 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
9ba0: 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20  file. (although 
9bb0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  the in-memory jo
9bc0: 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  urnal implementa
9bd0: 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72  tion may .  ** r
9be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
9bf0: 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74  RR_NOMEM while t
9c00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9c10: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
9c20: 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74  ). It .  ** is t
9c30: 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73  herefore not pos
9c40: 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d  sible for an in-
9c50: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20  memory pager to 
9c60: 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
9c70: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a  .  ** state..  *
9c80: 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
9c90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9ca0: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
9cb0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9cc0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9cd0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9ce0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9cf0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9d00: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
9d10: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
9d20: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
9d30: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
9d40: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
9d50: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
9d60: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
9d70: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
9d80: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
9d90: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
9da0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
9db0: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
9dc0: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
9dd0: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
9de0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9df0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
9e00: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
9e10: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9e20: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9e30: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
9e40: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
9e50: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
9e60: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
9e70: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
9e80: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
9e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9ea0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9eb0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9ec0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ed0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
9ee0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
9ef0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
9f00: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
9f10: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9f20: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
9f30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9f40: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9f50: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9f60: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9f70: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9f80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9f90: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
9fa0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
9fb0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9fc0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
9fd0: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
9fe0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9ff0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a000: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a010: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a020: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a030: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a040: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a050: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a060: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a070: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a080: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a090: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a0a0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a0b0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a0c0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a0d0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a0e0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a0f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a100: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a110: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a120: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a130: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a140: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a150: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a160: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a170: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a180: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a190: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a1a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a1b0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a1c0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a1d0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a1e0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a1f0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a200: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a210: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a220: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a230: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a240: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a250: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a260: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a270: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a280: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a290: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a2a0: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a2b0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a2c0: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a2d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a2e0: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a2f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a300: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a310: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a320: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a330: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a340: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a350: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a360: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a380: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a390: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a3a0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a3b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a3c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a3d0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a3e0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a3f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a400: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a410: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a420: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a430: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a440: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a450: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a460: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a470: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a480: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a490: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a4a0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a4b0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a4c0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a4d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a4e0: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a4f0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a500: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a510: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a520: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a530: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a540: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a550: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a560: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a570: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a580: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a590: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a5a0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
a5b0: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a5c0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a5d0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a5e0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
a5f0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a600: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a610: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a620: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a630: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a640: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a650: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
a660: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
a670: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a680: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a690: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a6a0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a6b0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a6d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a6e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a6f0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a700: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a710: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
a720: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
a730: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
a740: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
a750: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
a760: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
a770: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
a780: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
a790: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
a7a0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
a7b0: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
a7c0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
a7d0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a7e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a7f0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
a800: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a810: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
a820: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
a830: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
a840: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a850: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a870: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a880: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a890: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a8a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a8b0: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a8c0: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a8d0: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a8e0: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a8f0: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a900: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a910: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a920: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a930: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a940: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a950: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a960: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a970: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
a980: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
a990: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
a9a0: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
a9b0: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
a9c0: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
a9d0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
a9e0: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
a9f0: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
aa00: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
aa10: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
aa20: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
aa30: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
aa40: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
aa50: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
aa60: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
aa70: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
aa80: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
aa90: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
aaa0: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
aab0: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
aac0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
aad0: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
aae0: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
aaf0: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
ab00: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
ab10: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
ab20: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
ab30: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
ab40: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
ab50: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
ab60: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
ab70: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
ab80: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
ab90: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
aba0: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
abb0: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
abc0: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
abd0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
abe0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
abf0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
ac00: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
ac10: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
ac20: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
ac30: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
ac40: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ac50: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ac60: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
ac70: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
ac80: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ac90: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aca0: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
acb0: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
acc0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
acd0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
ace0: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
acf0: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
ad00: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ad10: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
ad20: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
ad30: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ad40: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
ad50: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ad60: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
ad70: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
ad80: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
ad90: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ada0: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
adb0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
adc0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
add0: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
ade0: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
adf0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
ae00: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
ae10: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
ae20: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
ae30: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
ae40: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
ae50: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
ae60: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
ae70: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
ae80: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
ae90: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aea0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
aeb0: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
aec0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aed0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aee0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
aef0: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
af00: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
af10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
af20: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
af30: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
af40: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
af50: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
af60: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
af70: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
af80: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
af90: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
afa0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
afb0: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
afc0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
afd0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
afe0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
aff0: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
b000: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b010: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
b020: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
b030: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
b040: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
b050: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
b060: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
b070: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
b080: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
b090: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
b0a0: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
b0b0: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
b0c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b0d0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
b0e0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
b0f0: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
b100: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b110: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
b120: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
b130: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
b140: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
b150: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
b160: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
b170: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
b180: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
b190: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b1a0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
b1b0: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
b1c0: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
b1d0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
b1e0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b1f0: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
b200: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
b210: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
b220: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b230: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b240: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b250: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b260: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b270: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b280: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
b290: 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  p;.  Pgno pgno =
b2a0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e   pPg->pgno;.  in
b2b0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b2c0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b2d0: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
b2e0: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
b2f0: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
b300: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
b310: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
b320: 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
b330: 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  l(p->pInSavepoin
b340: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b350: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b360: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b370: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
b380: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
b390: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b3a0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b3b0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b3c0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b3d0: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b3e0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b3f0: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b400: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b410: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b420: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b430: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64  g->pgno);.}.#end
b440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
b450: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b460: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
b470: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b480: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
b490: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
b4a0: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
b4b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
b4c0: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
b4d0: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
b4e0: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b4f0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b500: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
b510: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
b520: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
b530: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
b540: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
b550: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b560: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b570: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
b580: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
b590: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
b5a0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
b5b0: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
b5c0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
b5d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b5e0: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
b5f0: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
b600: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b610: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b620: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b630: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
b640: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
b650: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
b660: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
b670: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
b680: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
b690: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  ).../*.** Write 
b6a0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b6b0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
b6c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
b6d0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
b6e0: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
b6f0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
b700: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b710: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
b720: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
b730: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b740: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b750: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
b760: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
b770: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
b780: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
b790: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
b7a0: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
b7b0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
b7c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b7d0: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
b7e0: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
b7f0: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f  her NO_LOCK.** o
b800: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52  r SHARED_LOCK. R
b810: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
b820: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
b830: 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28  call to xUnlock(
b840: 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73  ).** succeeds, s
b850: 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f  et the Pager.eLo
b860: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d  ck variable to m
b870: 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70  atch the (attemp
b880: 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a  ted) new lock..*
b890: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b8a0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b8b0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b8c0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
b8d0: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
b8e0: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
b8f0: 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f  y it. See the co
b900: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
b910: 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55  #define of .** U
b920: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
b930: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
b940: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
b950: 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63  c int pagerUnloc
b960: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
b970: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
b980: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
b990: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
b9a0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
b9b0: 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
b9c0: 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29  ->eLock==eLock )
b9d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
b9e0: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  k==NO_LOCK || eL
b9f0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ba00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
ba10: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
ba20: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
ba30: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  er)==0 );.  if( 
ba40: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
ba50: 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
ba60: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
ba70: 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63  =eLock );.    rc
ba80: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63   = pPager->noLoc
ba90: 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  k ? SQLITE_OK : 
baa0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
bab0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63  pPager->fd, eLoc
bac0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  k);.    if( pPag
bad0: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
bae0: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  WN_LOCK ){.     
baf0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
bb00: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
bb10: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
bb20: 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  UNLOCK %p %d\n",
bb30: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bb40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bb50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
bb60: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bb70: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
bb80: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
bb90: 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f  either SHARED_LO
bba0: 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f  CK,.** RESERVED_
bbb0: 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56  LOCK or EXCLUSIV
bbc0: 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63  E_LOCK. If the c
bbd0: 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73  aller is success
bbe0: 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20  ful, set the.** 
bbf0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
bc00: 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20  able to the new 
bc10: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a  locking state. .
bc20: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
bc30: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
bc40: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
bc50: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
bc60: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61  nction is .** ca
bc70: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
bc80: 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68  ify it unless th
bc90: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
bca0: 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45  ate is EXCLUSIVE
bcb0: 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74  _LOCK. .** See t
bcc0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
bcd0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
bce0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
bcf0: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
bd00: 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  .** of this..*/.
bd10: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bd20: 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  LockDb(Pager *pP
bd30: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
bd40: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
bd50: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
bd60: 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  t( eLock==SHARED
bd70: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
bd80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
bd90: 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
bda0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  E_LOCK );.  if( 
bdb0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c  pPager->eLock<eL
bdc0: 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ock || pPager->e
bdd0: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
bde0: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  CK ){.    rc = p
bdf0: 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20  Pager->noLock ? 
be00: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
be10: 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
be20: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
be30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
be40: 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e  _OK && (pPager->
be50: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
be60: 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  OCK||eLock==EXCL
be70: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20  USIVE_LOCK) ){. 
be80: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
be90: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
bea0: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
beb0: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bec0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
bed0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
bee0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
bef0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
bf00: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
bf10: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
bf20: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
bf30: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
bf40: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
bf50: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
bf60: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
bf70: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
bf80: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
bf90: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
bfa0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
bfb0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
bfc0: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
bfd0: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
bfe0: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
bff0: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
c000: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c010: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
c020: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
c030: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
c040: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
c050: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  ze..**.** The op
c060: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c  timization is al
c070: 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65  so always enable
c080: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
c090: 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20  files. It is.** 
c0a0: 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c  an error to call
c0b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c0c0: 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e  f pPager is open
c0d0: 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed on an in-memo
c0e0: 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  ry.** database..
c0f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
c100: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
c110: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
c120: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
c130: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
c140: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
c150: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
c160: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c170: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
c180: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
c190: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
c1a0: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
c1b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c1c0: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
c1d0: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
c1e0: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
c1f0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c200: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
c210: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
c220: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
c230: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
c260: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
c270: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b      int nSector;
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
c2a0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  size */.    int 
c2b0: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  szPage;         
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2d0: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   Page size */.. 
c2e0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
c2f0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
c300: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
c310: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
c320: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
c330: 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  >fd);.    nSecto
c340: 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74  r = pPager->sect
c350: 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61  orSize;.    szPa
c360: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
c370: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
c380: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c390: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
c3a0: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
c3b0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c3c0: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
c3d0: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
c3e0: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
c3f0: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
c400: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
c410: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
c420: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c430: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c440: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c450: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
c460: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
c470: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
c480: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
c490: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
c4a0: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
c4b0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
c4c0: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
c4d0: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
c4e0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
c4f0: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
c500: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
c510: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
c520: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
c530: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
c540: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
c550: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
c560: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
c570: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c580: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
c590: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
c5a0: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
c5b0: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
c5c0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
c5d0: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
c5e0: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
c5f0: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
c600: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
c610: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
c620: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
c630: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
c640: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
c650: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
c660: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
c670: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
c680: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
c690: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
c6a0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
c6b0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
c6c0: 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48  {.  pPage->pageH
c6d0: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
c6e0: 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  hash(pPage);.}..
c6f0: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
c700: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
c710: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
c720: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
c730: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c740: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
c750: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
c760: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
c770: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
c780: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
c790: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
c7a0: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
c7b0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
c7c0: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
c7d0: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
c7e0: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
c7f0: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
c800: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
c810: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
c820: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
c830: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
c840: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
c850: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
c860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
c870: 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
c880: 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70  DIRTY) || pPg->p
c890: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
c8a0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
c8b0: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
c8c0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c8d0: 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20  X,Y)  0.#define 
c8e0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58  pager_pagehash(X
c8f0: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
c900: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
c910: 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  X).#define CHECK
c920: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
c930: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
c940: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
c950: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
c960: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
c970: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
c980: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
c990: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
c9a0: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
c9b0: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
c9c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c9d0: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
c9e0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
c9f0: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
ca00: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
ca10: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
ca20: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
ca30: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
ca40: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
ca50: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
ca60: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
ca70: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
ca80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ca90: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
caa0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
cab0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
cac0: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
cad0: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
cae0: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
caf0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
cb00: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
cb10: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
cb20: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
cb30: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
cb40: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
cb50: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
cb60: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
cb70: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
cb80: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
cb90: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
cba0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
cbb0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
cbc0: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
cbd0: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
cbe0: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
cbf0: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
cc00: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
cc10: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
cc20: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
cc30: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
cc40: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
cc50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cc60: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
cc70: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
cc80: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
cc90: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
cca0: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
ccb0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
ccc0: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
ccd0: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
cce0: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
ccf0: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
cd00: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
cd10: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
cd20: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
cd30: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
cd40: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
cd50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cd60: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
cd70: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
cd80: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
cd90: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
cda0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
cdb0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
cdc0: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
cdd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
cde0: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
cdf0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
ce00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ce10: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
ce20: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
ce30: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
ce40: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
ce50: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
ce80: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
ceb0: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
cec0: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
ced0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
cee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
cef0: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
cf00: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
cf10: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
cf20: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
cf30: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
cf40: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
cf50: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
cf60: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cf80: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
cf90: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
cfa0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
cfb0: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
cfc0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
cfd0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
cfe0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
cff0: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
d000: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
d010: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
d020: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
d030: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
d040: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d050: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
d060: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
d070: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
d080: 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d  ter .   || len==
d090: 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  0 .   || SQLITE_
d0a0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
d0b0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
d0c0: 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20  12, &cksum)).   
d0d0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d0e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d0f0: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
d100: 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c   8, szJ-8)).   |
d110: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
d120: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
d130: 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  8).   || SQLITE_
d140: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d150: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
d160: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
d170: 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20  -16-len)).  ){. 
d180: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d190: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
d1a0: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
d1b0: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
d1c0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
d1d0: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
d1e0: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
d1f0: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
d200: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
d210: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
d220: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
d230: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
d240: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
d250: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
d260: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
d270: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d280: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
d290: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
d2a0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
d2b0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
d2c0: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
d2d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
d2e0: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
d2f0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
d300: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
d310: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
d320: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  0;.  }.  zMaster
d330: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
d340: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
d350: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
d360: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
d370: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62   of the sector b
d380: 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d  oundary at or im
d390: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f  mediately .** fo
d3a0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75  llowing the valu
d3b0: 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e in pPager->jou
d3c0: 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e  rnalOff, assumin
d3d0: 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73  g a sector .** s
d3e0: 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73  ize of pPager->s
d3f0: 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e  ectorSize bytes.
d400: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
d410: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
d420: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  512:.**.**   Pag
d430: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20  er.journalOff   
d440: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61         Return va
d450: 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  lue.**   -------
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d480: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20  0.**   512      
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20   512.**   100   
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30      512.**   200
d4f0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
d500: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
d510: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f  */.static i64 jo
d520: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50  urnalHdrOffset(P
d530: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
d540: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
d550: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
d560: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
d570: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
d580: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
d590: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d5a0: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
d5b0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d5c0: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
d5d0: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
d5e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
d5f0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d600: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
d610: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
d620: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
d630: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
d640: 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  turn offset;.}..
d650: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
d660: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
d670: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
d680: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
d690: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
d6a0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
d6b0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
d6c0: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
d6d0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  n written to.** 
d6e0: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
d6f0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
d700: 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f  i.e. if Pager.jo
d710: 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a  urnalOff==0)..**
d720: 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74  .** If doTruncat
d730: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  e is non-zero or
d740: 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e   the Pager.journ
d750: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69  alSizeLimit vari
d760: 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  able is.** set t
d770: 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  o 0, then trunca
d780: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
d790: 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
d7a0: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
d7b0: 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68  wise,.** zero th
d7c0: 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72  e 28-byte header
d7d0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
d7e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d7f0: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
d800: 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  e, .** if the pa
d810: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f  ger is not in no
d820: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63  -sync mode, sync
d830: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d840: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  e immediately .*
d850: 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  * after writing 
d860: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74  or truncating it
d870: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72  ..**.** If Pager
d880: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
d890: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  t is set to a po
d8a0: 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  sitive, non-zero
d8b0: 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66   value, and.** f
d8c0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75  ollowing the tru
d8d0: 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69  ncation or zeroi
d8e0: 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ng described abo
d8f0: 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ve the size of t
d900: 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  he .** journal f
d910: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20  ile in bytes is 
d920: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
d930: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75   value, then tru
d940: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncate the.** jou
d950: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67  rnal file to Pag
d960: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
d970: 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a  mit bytes. The j
d980: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
d990: 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  .** not need to 
d9a0: 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  be synced follow
d9b0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
d9c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
d9d0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
d9e0: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
d9f0: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
da00: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
da10: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
da20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
da30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
da40: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
da50: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
da60: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
da70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
da80: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
dab0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
dac0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
dad0: 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d) );.  if( pPag
dae0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
daf0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20  {.    const i64 
db00: 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d  iLimit = pPager-
db10: 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
db20: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
db30: 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a  ache of jsl */..
db40: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a      IOTRACE(("JZ
db50: 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50  EROHDR %p\n", pP
db60: 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64  ager)).    if( d
db70: 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69  oTruncate || iLi
db80: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
db90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
dba0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
dbb0: 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  fd, 0);.    }els
dbc0: 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  e{.      static 
dbd0: 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48  const char zeroH
dbe0: 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20  dr[28] = {0};.  
dbf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dc00: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
dc10: 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69  jfd, zeroHdr, si
dc20: 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30  zeof(zeroHdr), 0
dc30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
dc40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
dc50: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
dc60: 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
dc70: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
dc80: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
dc90: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
dca0: 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
dcb0: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
dcc0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
dcd0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
dce0: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74  is committed but
dcf0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
dd00: 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
dd10: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
dd20: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
dd30: 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66   size limit conf
dd40: 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20  igured for .    
dd50: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
dd60: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t journal and th
dd70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
dd80: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65  urrently consume
dd90: 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70  s more.    ** sp
dda0: 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69  ace than that li
ddb0: 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20  mit allows for, 
ddc0: 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e  truncate it now.
ddd0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
dde0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63  d.    ** to sync
ddf0: 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77   the file follow
de00: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
de10: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
de20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
de30: 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a   && iLimit>0 ){.
de40: 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20        i64 sz;.  
de50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
de60: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
de70: 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20  r->jfd, &sz);.  
de80: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
de90: 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d  TE_OK && sz>iLim
dea0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  it ){.        rc
deb0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
dec0: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
ded0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
dee0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
def0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
df00: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
df10: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
df20: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
df30: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
df40: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
df50: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
df60: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
df70: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
df80: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
df90: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
dfa0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
dfb0: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
dfc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
dfd0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
dfe0: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
dff0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
e000: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
e010: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
e020: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
e030: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
e040: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
e050: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
e060: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
e070: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
e080: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
e090: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
e0a0: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
e0b0: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
e0c0: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
e0d0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
e0e0: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
e0f0: 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  nal..** - 4 byte
e100: 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  s: Database page
e110: 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f   size..** .** Fo
e120: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
e130: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
e140: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
e150: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
e160: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
e170: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
e180: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
e190: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e1b0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
e1c0: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
e1d0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
e1e0: 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  ;  /* Temporary 
e1f0: 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75  space used to bu
e200: 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ild header */.  
e210: 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75  u32 nHeader = (u
e220: 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
e230: 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62  ize;/* Size of b
e240: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
e250: 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20   by zHeader */. 
e260: 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20   u32 nWrite;    
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
e290: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77   header sector w
e2a0: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
e2b0: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
e2e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
e2f0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
e300: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
e310: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
e320: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66  e open. */..  if
e330: 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41  ( nHeader>JOURNA
e340: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
e350: 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
e360: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
e370: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
e380: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
e390: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
e3a0: 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68  ts and any of th
e3b0: 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20  em were created 
e3c0: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
e3d0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72  most recent jour
e3e0: 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77  nal header was w
e3f0: 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74  ritten, update t
e400: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61  he .  ** PagerSa
e410: 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
e420: 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20  et fields now.. 
e430: 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
e440: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
e450: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
e460: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53    if( pPager->aS
e470: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
e480: 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20  rOffset==0 ){.  
e490: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
e4a0: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
e4b0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
e4c0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
e4d0: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
e4e0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
e4f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
e500: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
e510: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
e520: 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74  /* .  ** Write t
e530: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20  he nRec Field - 
e540: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
e550: 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
e560: 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a  follow this.  **
e570: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
e580: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20   Normally, zero 
e590: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
e5a0: 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73  is value at this
e5b0: 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65   time..  ** Afte
e5c0: 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72  r the records ar
e5d0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a  e added to the j
e5e0: 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20  ournal (and the 
e5f0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20  journal synced, 
e600: 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c  .  ** if in full
e610: 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65  -sync mode), the
e620: 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69   zero is overwri
e630: 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72  tten with the tr
e640: 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  ue number.  ** o
e650: 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73  f records (see s
e660: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20  yncJournal()).. 
e670: 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65   **.  ** A faste
e680: 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73  r alternative is
e690: 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46   to write 0xFFFF
e6a0: 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63  FFFF to the nRec
e6b0: 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a   field. When.  *
e6c0: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f  * reading the jo
e6d0: 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65  urnal this value
e6e0: 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f   tells SQLite to
e6f0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
e700: 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68  .  ** rest of th
e710: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
e720: 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61  ontains valid pa
e730: 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  ge records. This
e740: 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a   assumption.  **
e750: 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61   is dangerous, a
e760: 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  s if a failure o
e770: 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77  ccurred whilst w
e780: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
e790: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
e7a0: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
e7b0: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
e7c0: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
e7d0: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
e7e0: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
e7f0: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
e800: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e810: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
e820: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
e830: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
e840: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
e850: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
e860: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
e870: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
e880: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
e890: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
e8a0: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
e8b0: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
e8c0: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
e8d0: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
e8e0: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
e8f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e900: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
e910: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
e920: 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
e930: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20  noSync );.  if( 
e940: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
e950: 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
e960: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
e970: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
e980: 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  ).   || (sqlite3
e990: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
e9a0: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
e9b0: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
e9c0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
e9d0: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
e9e0: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
e9f0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
ea00: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
ea10: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
ea20: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
ea30: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
ea40: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
ea50: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a  se{.    memset(z
ea60: 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Header, 0, sizeo
ea70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ea80: 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  +4);.  }..  /* T
ea90: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
eaa0: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72  hash initializer
eab0: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72   */ .  sqlite3_r
eac0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
ead0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
eae0: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
eaf0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
eb00: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
eb10: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
eb20: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
eb30: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
eb40: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
eb50: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
eb60: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb70: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eb80: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
eb90: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
eba0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
ebb0: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
ebc0: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
ebd0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
ebe0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ebf0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
ec00: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
ec10: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54  orSize);..  /* T
ec20: 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  he page size */.
ec30: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
ec40: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
ec50: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20  rnalMagic)+16], 
ec60: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ec70: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
ec80: 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f  izing the tail o
ec90: 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  f the buffer is 
eca0: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
ecb0: 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20  Everything.  ** 
ecc0: 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68  works find if th
ecd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73  e following mems
ece0: 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e  et() is omitted.
ecf0: 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69    But initializi
ed00: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f  ng.  ** the memo
ed10: 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67  ry prevents valg
ed20: 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61  rind from compla
ed30: 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65  ining, so we are
ed40: 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a   willing to.  **
ed50: 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72   take the perfor
ed60: 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a  mance hit..  */.
ed70: 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65    memset(&zHeade
ed80: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
ed90: 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a  lMagic)+20], 0,.
eda0: 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72           nHeader
edb0: 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  -(sizeof(aJourna
edc0: 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20  lMagic)+20));.. 
edd0: 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69   /* In theory, i
ede0: 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73  t is only necess
edf0: 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
ee00: 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74   28 bytes that t
ee10: 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  he .  ** journal
ee20: 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73   header consumes
ee30: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
ee40: 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20  file here. Then 
ee50: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  increment the . 
ee60: 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   ** Pager.journa
ee70: 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79  lOff variable by
ee80: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
ee90: 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
eea0: 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73   .  ** record is
eeb0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
eec0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72  following sector
eed0: 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20   (leaving a gap 
eee0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  in the file.  **
eef0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d   that will be im
ef00: 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20  plicitly filled 
ef10: 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20  in by the OS).. 
ef20: 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72   **.  ** However
ef30: 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73   it has been dis
ef40: 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20  covered that on 
ef50: 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69  some systems thi
ef60: 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20  s pattern can . 
ef70: 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61   ** be significa
ef80: 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e  ntly slower than
ef90: 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72   contiguously wr
efa0: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
efb0: 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65  e file,.  ** eve
efc0: 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
efd0: 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69  explicitly writi
efe0: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62  ng data to the b
eff0: 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a  lock of .  ** (J
f000: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
f010: 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77  28) bytes that w
f020: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
f030: 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74   So that is what
f040: 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a  .  ** is done. .
f050: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f    **.  ** The lo
f060: 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68  op is required h
f070: 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20  ere in case the 
f080: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c  sector-size is l
f090: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
f0a0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61    ** database pa
f0b0: 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74  ge size. Since t
f0c0: 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65  he zHeader buffe
f0d0: 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e  r is only Pager.
f0e0: 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79  pageSize.  ** by
f0f0: 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72  tes in size, mor
f100: 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20  e than one call 
f110: 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  to sqlite3OsWrit
f120: 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69  e() may be requi
f130: 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75  red.  ** to popu
f140: 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  late the entire 
f150: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
f160: 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66  ector..  */ .  f
f170: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
f180: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
f190: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
f1a0: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
f1b0: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
f1c0: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
f1d0: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
f1e0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
f1f0: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
f200: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
f210: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
f220: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
f230: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
f240: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
f250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
f260: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
f270: 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
f280: 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61  alOff );.    pPa
f290: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f2a0: 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a  += nHeader;.  }.
f2b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f2c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
f2d0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
f2e0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
f2f0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
f300: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
f310: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f320: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
f330: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
f340: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
f350: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
f360: 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20  le. The current 
f370: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
f380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f390: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67  given by.** pPag
f3a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20  er->journalOff. 
f3b0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
f3c0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
f3d0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
f3e0: 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69  r.** a descripti
f3f0: 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
f400: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
f410: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
f420: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
f430: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65  cessfully, *pNRe
f440: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
f450: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
f460: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
f470: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
f480: 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20  and *pDbSize is 
f490: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
f4a0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
f4b0: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
f4c0: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
f4d0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
f4e0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
f4f0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
f500: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
f510: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f520: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
f530: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
f540: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
f550: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
f560: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
f570: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
f580: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
f590: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
f5a0: 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61  ned and *pNRec a
f5b0: 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20  nd *PDbSize are 
f5c0: 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a  undefined.  If J
f5d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
f5e0: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
f5f0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f600: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
f610: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
f620: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
f630: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
f640: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
f650: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
f660: 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
f670: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48  ect */.  int isH
f680: 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  ot,.  i64 journa
f690: 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  lSize,          
f6a0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
f6b0: 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  e open journal f
f6c0: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
f6d0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20    u32 *pNRec,   
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f6f0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  * OUT: Value rea
f700: 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20  d from the nRec 
f710: 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a  field */.  u32 *
f720: 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20  pDbSize         
f730: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f740: 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61  Value of origina
f750: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
f760: 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  field */.){.  in
f770: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
f780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
f790: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
f7a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
f7b0: 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41  gic[8];     /* A
f7c0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
f7d0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
f7e0: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
f7f0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
f800: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
f810: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62  journal header b
f820: 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20  eing read */..  
f830: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
f840: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
f850: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
f860: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
f870: 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  . */..  /* Advan
f880: 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ce Pager.journal
f890: 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74  Off to the start
f8a0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63   of the next sec
f8b0: 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  tor. If the.  **
f8c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
f8d0: 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
f8e0: 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61  here to be a hea
f8f0: 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68  der stored at th
f900: 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72  is.  ** point, r
f910: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
f920: 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  E..  */.  pPager
f930: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
f940: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
f950: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
f960: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f970: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
f980: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
f990: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
f9a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f9b0: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
f9c0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f9d0: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  lOff;..  /* Read
f9e0: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20   in the first 8 
f9f0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
fa00: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20  rnal header. If 
fa10: 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
fa20: 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69  h.  ** the  magi
fa30: 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61  c string found a
fa40: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
fa50: 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ach journal head
fa60: 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  er, return.  ** 
fa70: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20  SQLITE_DONE. If 
fa80: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
fa90: 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
faa0: 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
fab0: 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65  ise,.  ** procee
fac0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
fad0: 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d  Hot || iHdrOff!=
fae0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
faf0: 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  dr ){.    rc = s
fb00: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
fb10: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
fb20: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
fb30: 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20  , iHdrOff);.    
fb40: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
fb50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
fb60: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
fb70: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
fb80: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fb90: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
fba0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fbb0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
fbc0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
fbd0: 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62  first three 32-b
fbe0: 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  it fields of the
fbf0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a   journal header:
fc00: 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66   The nRec.  ** f
fc10: 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73  ield, the checks
fc20: 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61  um-initializer a
fc30: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
fc40: 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72  size at the star
fc50: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72  t.  ** of the tr
fc60: 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72  ansaction. Retur
fc70: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
fc80: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
fc90: 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   wrong..  */.  i
fca0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
fcb0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
fcc0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
fcd0: 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20  Off+8, pNRec)). 
fce0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
fcf0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
fd00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
fd10: 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65  drOff+12, &pPage
fd20: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20  r->cksumInit)). 
fd30: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
fd40: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
fd50: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
fd60: 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a  drOff+16, pDbSiz
fd70: 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e)).  ){.    ret
fd80: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
fd90: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
fda0: 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
fdb0: 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20  u32 iPageSize;  
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fdd0: 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  Page-size field 
fde0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fdf0: 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65  r */.    u32 iSe
fe00: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
fe10: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d        /* Sector-
fe20: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
fe30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
fe40: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
fe50: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
fe60: 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e  ector-size journ
fe70: 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73  al header fields
fe80: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  . */.    if( SQL
fe90: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
fea0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
feb0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30  >jfd, iHdrOff+20
fec0: 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29  , &iSectorSize))
fed0: 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
fee0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
fef0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
ff00: 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69  , iHdrOff+24, &i
ff10: 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29  PageSize)).    )
ff20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
ff30: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
ff40: 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   Versions of SQL
ff50: 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35  ite prior to 3.5
ff60: 2e 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d  .8 set the page-
ff70: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
ff80: 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
ff90: 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e   header to zero.
ffa0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
ffb0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50  ssume that the P
ffc0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
ffd0: 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
ffe0: 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
fff0: 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
10000 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
10010 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d    if( iPageSize=
10020 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67  =0 ){.      iPag
10030 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
10040 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
10050 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
10060 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  at the values re
10070 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
10080 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
10090 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20  -size fields.   
100a0 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72   ** are within r
100b0 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20  ange. To be 'in 
100c0 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c  range', both val
100d0 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61  ues need to be a
100e0 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66   power.    ** of
100f0 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61   two greater tha
10100 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31  n or equal to 51
10110 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74  2 or 32, and not
10120 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
10130 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70  eir .    ** resp
10140 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74  ective compile t
10150 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69  ime maximum limi
10160 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
10170 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32  f( iPageSize<512
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65    || iSectorSize
101a0 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67  <32.     || iPag
101b0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
101c0 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53  _PAGE_SIZE || iS
101d0 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
101e0 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c  CTOR_SIZE.     |
101f0 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  | ((iPageSize-1)
10200 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20  &iPageSize)!=0  
10210 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a   || ((iSectorSiz
10220 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65  e-1)&iSectorSize
10230 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
10240 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74     /* If the eit
10250 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a  her the page-siz
10260 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
10270 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   in the journal-
10280 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20  header is .     
10290 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   ** invalid, the
102a0 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  n the process th
102b0 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75  at wrote the jou
102c0 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74  rnal-header must
102d0 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20   have .      ** 
102e0 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74  crashed before t
102f0 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79  he header was sy
10300 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  nced. In this ca
10310 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  se stop reading 
10320 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
10330 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
10340 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
10360 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  NE;.    }..    /
10370 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67  * Update the pag
10380 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  e-size to match 
10390 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
103a0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  rom the journal.
103b0 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74   .    ** Use a t
103c0 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
103d0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
103e0 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  t malloc failure
103f0 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
10400 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10410 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20  () is tested..  
10420 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
10430 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
10440 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
10450 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20  PageSize, -1);. 
10460 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
10470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
10480 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10490 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
104a0 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
104b0 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
104c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  .    ** the proc
104d0 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
104e0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
104f0 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
10500 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  as.    ** create
10510 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
10520 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
10530 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
10540 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20  utine.    ** is 
10550 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
10560 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
10570 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
10580 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a  ocal value.    *
10590 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
105a0 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
105b0 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
105c0 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
105d0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
105e0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53  >sectorSize = iS
105f0 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a  ectorSize;.  }..
10600 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10610 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
10620 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
10630 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10640 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
10650 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
10660 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
10670 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
10680 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
10690 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
106a0 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
106b0 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
106c0 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
106d0 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
106e0 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
106f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
10700 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10710 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
10720 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
10730 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10740 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
10750 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
10760 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
10770 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
10780 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
10790 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  t is:.**.**   + 
107a0 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
107b0 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e  J_PGNO..**   + N
107c0 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
107d0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
107e0 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b  in utf-8..**   +
107f0 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e   4 bytes: N (len
10800 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
10810 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79  urnal name in by
10820 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d  tes, no nul-term
10830 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20  inator)..**   + 
10840 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
10850 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
10860 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20  cksum..**   + 8 
10870 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
10880 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
10890 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
108a0 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
108b0 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
108c0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
108d0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
108e0 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68  name, where each
108f0 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
10900 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64  eted as a signed
10910 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a   8-bit integer..
10920 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
10930 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
10940 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
10950 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
10960 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
10970 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
10980 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
10990 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
109a0 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
109b0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
109c0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
109d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
10a00 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
10a10 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
10a20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
10a30 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
10a40 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
10a50 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
10a60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
10a70 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20  et of header in 
10a80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
10a90 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20    i64 jrnlSize; 
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
10ac0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69  urnal file on di
10ad0 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  sk */.  u32 cksu
10ae0 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
10af0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
10b00 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a  ksum of string z
10b10 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  Master */..  ass
10b20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
10b30 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61  Master==0 );.  a
10b40 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
10b50 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
10b60 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a    if( !zMaster .
10b70 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
10b80 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
10b90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
10ba0 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70  ORY .   || !isOp
10bb0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a  en(pPager->jfd).
10bc0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
10bd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10be0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
10bf0 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
10c00 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
10c10 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
10c20 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20  journalOff );.. 
10c30 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
10c40 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  e length in byte
10c50 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73  s and the checks
10c60 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f  um of zMaster */
10c70 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30  .  for(nMaster=0
10c80 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  ; zMaster[nMaste
10c90 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a  r]; nMaster++){.
10ca0 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
10cb0 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20  ster[nMaster];. 
10cc0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
10cd0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
10ce0 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
10cf0 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
10d00 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
10d10 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
10d20 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
10d30 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
10d40 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
10d50 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
10d60 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
10d70 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
10d80 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
10d90 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
10da0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
10db0 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
10dc0 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
10dd0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  er);.  }.  iHdrO
10de0 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
10df0 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
10e00 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
10e10 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20  journal data to 
10e20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
10e30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a  ournal file. If.
10e40 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
10e50 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65  curs, return the
10e60 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
10e70 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a  he caller..  */.
10e80 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20    if( (0 != (rc 
10e90 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
10ea0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10eb0 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
10ec0 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20  O(pPager)))).   
10ed0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
10ee0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
10ef0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
10f00 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64  er, nMaster, iHd
10f10 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20  rOff+4))).   || 
10f20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
10f30 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
10f40 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
10f50 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
10f60 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10f70 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10f80 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10f90 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
10fa0 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c  4, cksum))).   |
10fb0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10fc0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10fd0 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
10fe0 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20  alMagic, 8,.    
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64               iHd
11010 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
11020 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
11030 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
11040 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11050 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
11060 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
11070 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
11080 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
11090 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
110a0 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
110b0 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
110c0 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
110d0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
110e0 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
110f0 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
11100 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
11110 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
11120 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
11130 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
11140 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
11150 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
11160 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
11170 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
11180 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
11190 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
111a0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
111b0 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
111c0 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
111d0 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
111e0 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
111f0 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
11200 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
11210 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
11220 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
11230 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
11240 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
11250 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
11260 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11270 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
11280 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
11290 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
112a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
112b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
112c0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
112d0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
112e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
112f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
11310 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
11320 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
11330 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
11340 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
11350 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
11360 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11370 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11380 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  sion++;.  sqlite
11390 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
113a0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
113b0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
113c0 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
113d0 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
113e0 20 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67   Return the pPag
113f0 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
11400 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71   value.*/.u32 sq
11410 6c 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65  lite3PagerDataVe
11420 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  rsion(Pager *pPa
11430 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
11440 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
11450 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72  AGER_OPEN );.  r
11460 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44  eturn pPager->iD
11470 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f  ataVersion;.}../
11480 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
11490 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
114a0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
114b0 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
114c0 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
114d0 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
114e0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
114f0 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
11500 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
11510 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
11520 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
11530 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11540 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
11550 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
11560 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
11570 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
11580 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
11590 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
115a0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
115b0 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
115c0 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
115d0 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
115e0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
115f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
11600 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
11610 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
11620 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
11630 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
11640 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11650 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d   || sqlite3IsMem
11660 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
11670 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
11680 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11690 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
116a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
116b0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
116c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
116d0 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
116e0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
116f0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
11700 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
11710 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
11720 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
11730 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
11740 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
11750 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
11760 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
11770 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
11780 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11790 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
117a0 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
117b0 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
117c0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
117d0 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
117e0 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
117f0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
11800 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11820 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11830 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
11840 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
11850 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11860 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11870 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11880 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
11890 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
118a0 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
118b0 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
118c0 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
118d0 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
118e0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
118f0 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
11900 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
11910 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
11920 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
11930 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
11940 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
11950 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11970 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11980 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11990 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
119a0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
119b0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
119c0 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
119d0 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
119e0 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
119f0 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
11a00 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
11a10 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
11a20 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
11a30 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
11a40 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
11a50 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
11a60 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
11a70 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
11a80 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
11a90 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
11aa0 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
11ab0 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
11ac0 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
11ad0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
11ae0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
11af0 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
11b00 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
11b10 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11b20 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
11b30 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
11b40 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
11b50 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
11b60 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
11b70 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
11b80 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
11b90 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
11ba0 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
11bb0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
11bc0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11bd0 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
11be0 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
11bf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
11c00 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
11c10 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
11c20 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
11c30 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
11c40 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
11c50 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
11c60 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
11c70 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
11c80 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
11c90 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
11ca0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11cb0 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
11cc0 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
11cd0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
11ce0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
11cf0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11d00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11d10 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
11d20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11d30 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
11d40 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  );..  sqlite3Bit
11d50 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
11d60 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
11d70 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
11d80 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65  rnal = 0;.  rele
11d90 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
11da0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
11db0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
11dc0 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
11dd0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
11de0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
11df0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
11e00 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
11e10 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
11e20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
11e30 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
11e40 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
11e50 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
11e60 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
11e90 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
11ea0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
11eb0 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
11ec0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
11ed0 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
11ee0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
11ef0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
11f00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
11f10 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
11f20 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
11f30 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
11f40 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
11f50 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
11f60 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
11f70 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
11f80 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
11f90 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
11fa0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
11fb0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
11fc0 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
11fd0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
11fe0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
11ff0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
12000 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12010 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
12020 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12030 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12040 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
12050 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
12060 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12070 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
12080 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
12090 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
120a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
120b0 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
120c0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
120d0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
120e0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
120f0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
12100 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12110 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
12120 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
12130 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
12140 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
12150 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
12160 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
12170 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
12180 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
12190 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
121a0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
121b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
121c0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
121d0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
121e0 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
121f0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
12200 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
12210 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
12220 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
12230 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
12240 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
12250 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
12260 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
12270 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
12280 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
12290 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
122a0 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
122b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
122c0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
122d0 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
122e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
122f0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
12300 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
12310 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
12320 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
12330 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
12340 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
12350 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
12360 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
12370 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
12380 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
12390 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
123a0 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
123b0 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
123c0 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
123d0 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
123e0 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
123f0 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
12400 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
12410 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
12420 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
12430 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
12440 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
12450 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
12460 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
12470 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
12480 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12490 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
124a0 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
124b0 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
124c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
124d0 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
124e0 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
124f0 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
12500 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
12510 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
12520 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
12530 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
12540 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
12550 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
12560 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
12570 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
12580 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12590 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
125a0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
125b0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61  errCode ){.    a
125c0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
125d0 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
125e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
125f0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
12600 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
12610 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50  tempFile;.    pP
12620 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12630 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70  AGER_OPEN;.    p
12640 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12660 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
12670 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
12680 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
12690 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
126a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
126b0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
126c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
126d0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
126e0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
126f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12700 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12710 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
12720 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
12730 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12740 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12750 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12760 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12770 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
12780 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12790 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
127a0 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
127b0 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
127c0 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
127d0 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
127e0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
127f0 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12800 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12810 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12820 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
12830 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
12840 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
12850 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
12860 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12870 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
12880 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12890 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
128a0 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
128b0 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
128c0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
128d0 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
128e0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
128f0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12900 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12910 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12920 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
12930 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
12940 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
12950 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
12960 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
12970 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
12980 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12990 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
129a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
129b0 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
129c0 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
129d0 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
129e0 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
129f0 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12a00 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12a10 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12a20 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
12a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12a40 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
12a50 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
12a60 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
12a70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
12a80 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12a90 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12aa0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
12ab0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12ac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12ad0 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
12ae0 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
12af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12b00 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
12b10 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
12b20 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
12b30 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
12b40 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
12b50 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
12b60 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
12b70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12b80 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12b90 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12ba0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12bb0 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
12bc0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
12bd0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
12be0 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
12bf0 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
12c00 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
12c10 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
12c20 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
12c30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12c40 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
12c50 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12c60 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
12c70 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
12c80 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12c90 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
12ca0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12cb0 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
12cc0 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
12cd0 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
12ce0 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
12cf0 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
12d00 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
12d10 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
12d20 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
12d30 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
12d40 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
12d50 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
12d60 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
12d70 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
12d80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
12d90 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
12da0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
12db0 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
12dc0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
12dd0 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
12de0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
12df0 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
12e00 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
12e10 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
12e20 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
12e30 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
12e40 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
12e50 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
12e60 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
12e70 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
12e80 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
12e90 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
12ea0 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
12eb0 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
12ec0 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
12ed0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12ee0 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
12ef0 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
12f00 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
12f10 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
12f20 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
12f30 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
12f40 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
12f50 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
12f60 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
12f70 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
12f80 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
12f90 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
12fa0 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
12fb0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12fc0 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
12fd0 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
12fe0 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
12ff0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
13000 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
13010 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
13020 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
13030 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
13040 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
13050 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
13060 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
13070 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
13080 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
13090 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
130a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
130b0 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
130c0 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
130d0 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
130e0 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
130f0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13100 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
13110 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
13120 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
13130 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
13140 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13150 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
13160 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
13170 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
13180 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
13190 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
131a0 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
131b0 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
131c0 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
131d0 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
131e0 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
131f0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
13200 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
13210 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
13220 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
13230 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13240 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
13250 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
13260 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
13270 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
13280 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
13290 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
132a0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
132b0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
132c0 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
132d0 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
132e0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
132f0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
13300 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
13310 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
13320 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
13330 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
13340 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
13350 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
13360 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
13370 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
13380 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
13390 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
133a0 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
133b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
133c0 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
133d0 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
133e0 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
133f0 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
13400 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
13410 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
13420 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
13430 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
13440 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
13450 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
13460 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
13470 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
13480 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
13490 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
134a0 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
134b0 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
134c0 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
134d0 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
134e0 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
134f0 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
13500 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
13510 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
13520 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
13530 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
13540 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13550 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
13560 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
13570 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
13580 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13590 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
135a0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
135b0 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
135c0 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
135d0 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
135e0 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
135f0 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
13600 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13610 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
13620 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
13630 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
13640 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
13650 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13660 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
13670 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13680 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13690 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
136a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
136b0 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
136c0 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
136d0 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
136e0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
136f0 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
13700 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
13710 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
13720 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
13730 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
13740 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
13750 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
13760 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
13770 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
13780 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
13790 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
137a0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
137b0 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
137c0 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
137d0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
137e0 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
137f0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
13800 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
13810 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
13820 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
13830 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
13840 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
13850 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
13860 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
13870 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
13880 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
13890 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
138a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
138b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
138c0 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
138d0 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
138e0 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
138f0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
13900 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
13910 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
13920 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
13930 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
13940 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
13950 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
13960 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
13970 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
13980 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
13990 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
139a0 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
139b0 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
139c0 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
139d0 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
139e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
139f0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
13a00 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
13a10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13a20 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
13a30 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
13a40 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
13a50 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
13a60 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
13a70 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
13a80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13a90 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
13aa0 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
13ab0 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
13ac0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13ad0 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
13ae0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
13af0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
13b00 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13b10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
13b20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
13b30 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
13b40 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13b50 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
13b60 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
13b70 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
13b80 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  >jfd) ){.      a
13b90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13ba0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13bb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
13bc0 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71  MORY );.      sq
13bd0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
13be0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
13bf0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
13c00 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13c10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13c20 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
13c30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
13c40 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
13c50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13c60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
13c70 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
13c80 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
13c90 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
13ca0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
13cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13cc0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
13cd0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
13ce0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
13cf0 6e 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73  new file size is
13d00 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
13d10 65 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77  e inode right aw
13d20 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ay..          **
13d30 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6a   Otherwise the j
13d40 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73  ournal might res
13d50 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67  urrect following
13d60 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e   a power loss an
13d70 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
13d80 61 75 73 65 20 74 68 65 20 6c 61 73 74 20 74 72  ause the last tr
13d90 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c  ansaction to rol
13da0 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20  l back.  See.   
13db0 20 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a         ** https:
13dc0 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c  //bugzilla.mozil
13dd0 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e  la.org/show_bug.
13de0 63 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20  cgi?id=1072773. 
13df0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
13e00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13e10 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
13e20 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
13e30 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
13e40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13e50 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13e60 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
13e70 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13e80 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13e90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
13ea0 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20  ERSIST.      || 
13eb0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
13ec0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
13ed0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
13ee0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13ef0 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20  _WAL).    ){.   
13f00 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
13f10 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
13f20 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
13f30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f40 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
13f50 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  se{.      /* Thi
13f60 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20  s branch may be 
13f70 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61  executed with Pa
13f80 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  ger.journalMode=
13f90 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20  =MEMORY if.     
13fa0 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
13fb0 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65  l was just rolle
13fc0 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  d back. In this 
13fd0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
13fe0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73  .      ** file s
13ff0 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
14000 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20  and deleted. If 
14010 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
14020 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20  writes to.      
14030 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14040 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f  file, it will do
14050 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d   so using an in-
14060 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
14070 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14080 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 28 21  int bDelete = (!
14090 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
140a0 20 26 26 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e   && sqlite3Journ
140b0 61 6c 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  alExists(pPager-
140c0 3e 6a 66 64 29 29 3b 0a 20 20 20 20 20 20 61 73  >jfd));.      as
140d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
140e0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
140f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
14100 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
14110 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
14120 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14130 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
14140 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
14150 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14160 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14170 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
14180 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
14190 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
141a0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
141b0 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ( bDelete ){.   
141c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
141d0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
141e0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
141f0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
14200 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14210 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
14220 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
14230 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
14240 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
14250 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
14260 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
14270 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
14280 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
14290 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
142a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
142b0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
142c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
142d0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
142e0 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
142f0 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
14300 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
14310 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
14320 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Null(p);.    }. 
14330 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
14340 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
14350 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
14360 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
14370 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
14380 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
14390 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  = 0;.  sqlite3Pc
143a0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
143b0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
143c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
143d0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
143e0 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
143f0 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  dbSize);..  if( 
14400 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
14410 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72  er) ){.    /* Dr
14420 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65  op the WAL write
14430 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41  -lock, if any. A
14440 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e  lso, if the conn
14450 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20  ection was in . 
14460 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f     ** locking_mo
14470 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
14480 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e but is no long
14490 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43  er, drop the EXC
144a0 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c  LUSIVE .    ** l
144b0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
144c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
144d0 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20     */.    rc2 = 
144e0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69  sqlite3WalEndWri
144f0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
14500 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
14510 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51   assert( rc2==SQ
14520 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c  LITE_OK );.  }el
14530 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
14540 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14550 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  && pPager->dbFil
14560 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62  eSize>pPager->db
14570 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Size ){.    /* T
14580 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
14590 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ken when committ
145a0 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
145b0 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  n in rollback-jo
145c0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64  urnal.    ** mod
145d0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
145e0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
145f0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
14600 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
14610 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  ..    ** At this
14620 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e   point the journ
14630 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  al has been fina
14640 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72  lized and the tr
14650 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
14660 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  * successfully c
14670 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68  ommitted, but th
14680 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
14690 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
146a0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c  n the.    ** fil
146b0 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65  e. So it is safe
146c0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
146d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
146e0 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20  o its minimum.  
146f0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69    ** required si
14700 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ze.  */.    asse
14710 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
14720 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
14730 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
14740 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
14750 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ger, pPager->dbS
14760 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ize);.  }..  if(
14770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14780 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f  & bCommit && isO
14790 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
147a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
147b0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
147c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
147d0 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54  ITE_FCNTL_COMMIT
147e0 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20  _PHASETWO, 0);. 
147f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14800 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
14810 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
14820 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
14830 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
14840 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65     && (!pagerUse
14850 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73  Wal(pPager) || s
14860 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
14870 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
14880 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Wal, 0)).  ){.  
14890 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c    rc2 = pagerUnl
148a0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
148b0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
148c0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
148d0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
148e0 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
148f0 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
14900 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
14910 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65  aster = 0;..  re
14920 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
14930 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
14940 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
14950 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
14960 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
14970 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
14980 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
14990 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
149a0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
149b0 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
149c0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64  e ERROR state, d
149d0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
149e0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
149f0 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
14a00 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
14a10 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
14a20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
14a30 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
14a40 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
14a50 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
14a60 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
14a70 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
14a80 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62  move the pager b
14a90 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
14aa0 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d  e. If this .** m
14ab0 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
14ac0 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
14ad0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
14ae0 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
14af0 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  xt .** connectio
14b00 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  n to obtain a sh
14b10 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
14b20 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
14b30 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a  y be this one) .
14b40 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20  ** will roll it 
14b50 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
14b60 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
14b70 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
14b80 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14b90 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
14ba0 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
14bb0 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
14bc0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
14bd0 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
14be0 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
14bf0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
14c00 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69  ERROR state. Whi
14c10 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
14c20 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
14c30 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14c40 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
14c50 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
14c60 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
14c70 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
14c80 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
14c90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
14ca0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
14cb0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
14cc0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
14cd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  {.    assert( as
14ce0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14cf0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
14d00 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
14d10 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
14d20 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
14d30 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14d40 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14d50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14d60 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
14d80 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
14d90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
14da0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14db0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61  eMode ){.      a
14dc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
14dd0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14de0 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67  DER );.      pag
14df0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
14e00 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  on(pPager, 0, 0)
14e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
14e20 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
14e30 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  r);.}../*.** Par
14e40 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
14e50 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
14e60 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
14e70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
14e80 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
14e90 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
14ea0 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
14eb0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
14ec0 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
14ed0 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
14ee0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
14ef0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14f00 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
14f10 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
14f20 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
14f30 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
14f40 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
14f50 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
14f60 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
14f70 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
14f80 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
14f90 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
14fa0 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
14fb0 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
14fc0 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
14fd0 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
14fe0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
14ff0 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
15000 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
15010 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
15020 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
15030 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
15040 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
15050 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
15060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
15070 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
15080 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
15090 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
150a0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
150b0 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
150c0 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
150d0 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
150e0 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
150f0 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
15100 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
15110 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
15120 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
15130 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
15140 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
15150 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
15160 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
15170 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
15180 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
15190 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
151a0 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
151b0 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
151c0 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
151d0 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
151e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
151f0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
15200 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
15210 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
15220 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
15230 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
15240 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
15250 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
15260 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
15270 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15280 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
15290 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
152a0 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
152b0 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
152c0 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
152d0 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
152e0 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
152f0 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
15300 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
15310 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
15320 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
15330 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
15340 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
15350 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
15360 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
15370 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
15380 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
15390 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
153a0 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
153b0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
153c0 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
153d0 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
153e0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
15410 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
15420 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15430 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15440 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
15450 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
15460 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
15470 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
15480 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
15490 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
154a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
154b0 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
154c0 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
154d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
154e0 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
154f0 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
15500 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
15510 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
15520 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
15530 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
15540 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
15550 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
15560 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
15570 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
15580 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
15590 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  ** The main roll
155a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
155b0 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  s checksums - th
155c0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
155d0 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74  nal does .** not
155e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
155f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
15600 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
15610 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
15620 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
15630 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
15640 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
15650 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
15660 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
15670 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
15680 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
15690 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
156a0 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
156b0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
156c0 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
156d0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
156e0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
156f0 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
15700 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
15710 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
15720 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
15730 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
15740 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
15750 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
15760 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
15770 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
15780 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
15790 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
157a0 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
157b0 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
157c0 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
157d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
157e0 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
157f0 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
15800 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15810 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
15820 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
15830 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
15840 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
15850 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
15860 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
15870 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
15880 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15890 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
158a0 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
158b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
158c0 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
158d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
158e0 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
158f0 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
15900 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
15910 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
15920 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
15930 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
15940 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
15950 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
15960 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
15970 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
15980 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
15990 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
159a0 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
159b0 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
159c0 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
159d0 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
159e0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
159f0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
15a00 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
15a10 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
15a20 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
15a30 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
15a40 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
15a50 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
15a60 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
15a70 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
15a80 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
15a90 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
15aa0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
15ab0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
15ac0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15ad0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
15ae0 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
15af0 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
15b00 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
15b10 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
15b20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
15b30 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
15b40 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
15b50 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
15b60 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
15b70 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
15b80 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
15b90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15bb0 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
15bc0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
15bd0 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
15c00 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
15c10 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
15c20 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
15c30 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
15c40 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
15c50 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
15c60 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c80 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
15c90 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
15ca0 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
15cb0 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
15cc0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15cd0 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
15ce0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
15cf0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
15d00 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
15d10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
15d20 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
15d30 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
15d40 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d60 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
15d70 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
15d80 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
15d90 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
15da0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
15db0 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
15dc0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
15dd0 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
15e00 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
15e10 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
15e20 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
15e30 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
15e40 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
15e50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15e60 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
15e70 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
15e80 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
15e90 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
15ea0 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
15eb0 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
15ec0 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
15ed0 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
15ee0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
15ef0 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
15f00 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
15f10 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
15f20 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15f30 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
15f40 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
15f50 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
15f60 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
15f70 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
15f80 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
15f90 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
15fa0 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
15fb0 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
15fc0 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
15fd0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
15fe0 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
15ff0 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
16000 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
16010 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
16020 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
16030 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
16040 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
16050 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
16060 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
16070 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
16080 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
16090 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
160a0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
160b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
160c0 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
160d0 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
160e0 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
160f0 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
16100 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
16110 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16120 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
16130 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16140 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
16150 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
16160 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
16170 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16180 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
16190 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
161a0 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
161b0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
161c0 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
161d0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
161e0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
161f0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
16200 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
16210 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
16220 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
16230 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
16240 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
16250 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
16260 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
16270 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
16280 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
16290 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
162a0 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
162b0 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
162c0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
162d0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
162e0 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
162f0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
16300 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
16310 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
16320 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
16330 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
16340 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
16350 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
16360 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16370 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
16380 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
16390 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
163a0 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
163b0 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
163c0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
163d0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
163e0 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
163f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16400 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
16410 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
16420 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
16430 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
16440 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
16450 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
16460 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
16470 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
16480 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
16490 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
164a0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
164b0 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
164c0 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
164d0 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
164e0 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
164f0 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
16500 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
16510 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
16520 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
16530 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
16540 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
16550 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
16560 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
16570 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
16580 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
16590 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
165a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
165b0 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
165c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
165d0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
165e0 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
165f0 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
16600 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
16610 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
16620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16630 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
16640 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
16650 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
16660 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
16670 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
16680 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
16690 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
166a0 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
166b0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
166c0 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
166d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
166e0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
166f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
16700 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
16710 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
16720 20 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72   back before dur
16730 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
16740 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
16750 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
16760 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
16770 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
16780 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
16790 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
167a0 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
167b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
167c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
167d0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
167e0 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
167f0 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
16800 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
16810 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
16820 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
16830 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
16840 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
16850 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
16860 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
16870 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
16880 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
16890 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
168a0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41  e pager is in CA
168b0 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68  CHEMOD state, th
168c0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
168d0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
168e0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
168f0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
16900 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
16910 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
16920 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
16930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16940 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
16950 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
16960 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
16970 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
16980 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
16990 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
169a0 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
169b0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
169c0 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
169d0 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
169e0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
169f0 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
16a00 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
16a10 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
16a20 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
16a30 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
16a40 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
16a50 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
16a60 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
16a70 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
16a80 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
16a90 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
16aa0 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
16ab0 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
16ac0 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
16ad0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
16ae0 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
16af0 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45    ** If in WRITE
16b00 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f  R_DBMOD, WRITER_
16b10 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e  FINISHED or OPEN
16b20 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
16b30 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  update the.  ** 
16b40 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
16b50 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  t exists and the
16b60 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
16b70 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
16b80 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69  ked .  ** not di
16b90 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20  rty. Since this 
16ba0 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65  code is only exe
16bb0 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f  cuted in PAGER_O
16bc0 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20  PEN state for.  
16bd0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
16be0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
16bf0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
16c00 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
16c10 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66  is empty.  ** if
16c20 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
16c30 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a   OPEN state..  *
16c40 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
16c50 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
16c60 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
16c70 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
16c80 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
16c90 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
16ca0 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
16cb0 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
16cc0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
16cd0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
16ce0 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
16cf0 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
16d00 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
16d10 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
16d20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
16d30 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
16d40 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
16d50 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
16d60 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
16d70 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
16d80 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
16d90 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
16da0 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
16db0 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
16dc0 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
16dd0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
16de0 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
16df0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
16e00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
16e10 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
16e20 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
16e30 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
16e40 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
16e50 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
16e60 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
16e70 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
16e80 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
16e90 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
16ea0 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
16eb0 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
16ec0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
16ed0 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
16ee0 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
16ef0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16f00 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
16f10 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
16f20 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
16f30 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
16f40 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
16f50 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
16f60 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
16f70 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
16f80 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
16f90 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16fa0 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
16fb0 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
16fc0 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
16fd0 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
16fe0 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
16ff0 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
17000 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
17010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
17020 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
17030 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
17040 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
17050 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
17060 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
17070 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
17080 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
17090 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
170a0 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
170b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
170c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
170d0 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
170e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
170f0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
17100 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
17110 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73   pgno);.  }.  as
17120 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
17130 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
17140 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
17150 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
17160 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  Pg==0 );.  PAGER
17170 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
17180 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
17190 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
171a0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
171b0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
171c0 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
171d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
171e0 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20   (u8*)aData),.  
171f0 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
17200 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
17210 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
17220 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69  ").  ));.  if( i
17230 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
17240 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67   isSynced = pPag
17250 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a  er->noSync || (*
17260 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65  pOffset <= pPage
17270 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
17280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53    }else{.    isS
17290 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20  ynced = (pPg==0 
172a0 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
172b0 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
172c0 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  YNC));.  }.  if(
172d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
172e0 66 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65  fd).   && (pPage
172f0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
17300 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
17310 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
17320 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20  =PAGER_OPEN).   
17330 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
17340 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
17350 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
17360 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
17370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
17380 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
17390 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
173a0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
173b0 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
173c0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
173d0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
173e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
173f0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
17400 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50   (u8 *)aData, pP
17410 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
17420 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ofst);.    if( p
17430 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
17440 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
17450 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
17460 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d  ze = pgno;.    }
17470 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17480 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
17490 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
174a0 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
174b0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
174c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
174d0 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
174e0 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
174f0 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b  no, (u8*)aData);
17500 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
17510 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
17520 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 7, rc=SQLITE_
17530 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20  NOMEM, aData);. 
17540 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
17550 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20   !isMainJrnl && 
17560 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
17570 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f   If this is a ro
17580 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65  llback of a save
17590 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77  point and data w
175a0 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74  as not written t
175b0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  o.    ** the dat
175c0 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61  abase and the pa
175d0 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d  ge is not in-mem
175e0 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20  ory, there is a 
175f0 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a  potential.    **
17600 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74   problem. When t
17610 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20  he page is next 
17620 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62  fetched by the b
17630 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20  -tree layer, it 
17640 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
17650 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
17660 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
17670 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ch may or may no
17680 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72  t be .    ** cur
17690 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  rent. .    **.  
176a0 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61    ** There are a
176b0 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65   couple of diffe
176c0 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63  rent ways this c
176d0 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61  an happen. All a
176e0 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20  re quite.    ** 
176f0 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75  obscure. When ru
17700 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f  nning in synchro
17710 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20  nous mode, this 
17720 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
17730 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70  .    ** if the p
17740 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72  age is on the fr
17750 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73  ee-list at the s
17760 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
17770 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  saction, then.  
17780 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20    ** populated, 
17790 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67  then moved using
177a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
177b0 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  epage()..    **.
177c0 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74      ** The solut
177d0 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e  ion is to add an
177e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
177f0 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  to the cache con
17800 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  taining.    ** t
17810 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61  he data just rea
17820 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  d from the sub-j
17830 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65  ournal. Mark the
17840 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a   page as dirty .
17850 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68      ** and if th
17860 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73  e pager requires
17870 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c   a journal-sync,
17880 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70   then mark the p
17890 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72  age as .    ** r
178a0 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e  equiring a journ
178b0 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69  al-sync before i
178c0 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20  t is written..  
178d0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
178e0 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20   isSavepnt );.  
178f0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
17900 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
17910 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
17920 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  CK)==0 );.    pP
17930 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
17940 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f   |= SPILLFLAG_RO
17950 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d  LLBACK;.    rc =
17960 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
17970 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e  uire(pPager, pgn
17980 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20  o, &pPg, 1);.   
17990 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
179a0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
179b0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
179c0 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)!=0 );.    pPa
179d0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
179e0 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  &= ~SPILLFLAG_RO
179f0 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20  LLBACK;.    if( 
17a00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
17a20 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
17a30 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
17a40 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17a50 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
17a60 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
17a70 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
17a80 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65  should ever be e
17a90 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64  xplicitly rolled
17aa0 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
17ab0 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20   use, except.   
17ac0 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77   ** for page 1 w
17ad0 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
17ae0 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
17af0 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
17b00 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
17b10 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77  base active. How
17b20 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65  ever such a page
17b30 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
17b40 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ack as a result.
17b50 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74      ** of an int
17b60 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75  ernal error resu
17b70 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f  lting in an auto
17b80 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20  matic call to.  
17b90 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
17ba0 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  rRollback()..   
17bb0 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
17bc0 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d  ata;.    pData =
17bd0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
17be0 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28   memcpy(pData, (
17bf0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
17c00 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
17c10 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
17c20 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ter(pPg);.    if
17c30 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  ( isMainJrnl && 
17c40 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a  (!isSavepnt || *
17c50 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d  pOffset<=pPager-
17c60 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a  >journalHdr) ){.
17c70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
17c80 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
17c90 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20   page were just 
17ca0 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68  restored from th
17cb0 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a  e main .      **
17cc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
17cd0 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hen its content 
17ce0 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20  must be as they 
17cf0 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20  were when the . 
17d00 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
17d10 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70  ion was first op
17d20 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
17d30 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74  se we can mark t
17d40 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
17d50 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65   as clean, since
17d60 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e   there will be n
17d70 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  o need to write 
17d80 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20  it out to the.  
17d90 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e      ** database.
17da0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17db0 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
17dc0 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69  exception to thi
17dd0 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70  s rule. If the p
17de0 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  age is being rol
17df0 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  led.      ** bac
17e00 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73  k as part of a s
17e10 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61  avepoint (or sta
17e20 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b  tement) rollback
17e30 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20   from an .      
17e40 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  ** unsynced port
17e50 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ion of the main 
17e60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
17e70 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66  en it is not saf
17e80 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e.      ** to ma
17e90 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
17ea0 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65  lean. This is be
17eb0 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68  cause marking th
17ec0 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20  e page as.      
17ed0 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c  ** clean will cl
17ee0 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
17ef0 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69  ED_SYNC flag. Si
17f00 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a  nce the page is.
17f10 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
17f20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
17f30 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69  file (recorded i
17f40 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
17f50 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  al) and.      **
17f60 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
17f70 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65  SYNC flag is cle
17f80 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67  ared, if the pag
17f90 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  e is written to.
17fa0 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
17fb0 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
17fc0 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20  action, it will 
17fd0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
17fe0 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  ty but.      ** 
17ff0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
18000 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f  YNC flag will no
18010 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75  t be set. It cou
18020 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61  ld then potentia
18030 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  lly.      ** be 
18040 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f  written out into
18050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18060 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f  le before its jo
18070 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20  urnal file.     
18080 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73   ** segment is s
18090 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73  ynced. If a cras
180a0 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
180b0 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  or following thi
180c0 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  s,.      ** data
180d0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
180e0 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20  may ensue..     
180f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
18100 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
18110 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
18120 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
18130 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
18140 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
18150 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
18160 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
18170 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
18180 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
18190 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
181a0 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
181b0 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
181c0 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
181d0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
181e0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
181f0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
18200 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
18210 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
18220 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
18230 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
18240 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
18250 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
18260 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
18270 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
18280 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20  , pPg->pgno, 3, 
18290 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
182a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
182b0 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
182c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
182d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
182e0 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
182f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
18300 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18310 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
18320 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
18330 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
18340 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18350 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
18360 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
18370 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18380 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
18390 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
183a0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
183b0 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
183c0 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
183d0 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
183e0 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
183f0 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
18400 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
18410 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
18420 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
18430 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
18440 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
18450 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20  * When a master 
18460 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
18470 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70  created, it is p
18480 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
18490 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61  e names .** of a
184a0 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
184b0 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66  journals, one af
184c0 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72  ter another, for
184d0 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20  matted as utf-8 
184e0 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74  .** encoded text
184f0 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63  . The end of eac
18500 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
18510 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77  file is marked w
18520 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65  ith a .** nul-te
18530 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30  rminator byte (0
18540 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65  x00). i.e. the e
18550 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
18560 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
18570 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61  al.** file for a
18580 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76   transaction inv
18590 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62  olving two datab
185a0 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a  ases might be:.*
185b0 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69  *.**   "/home/bi
185c0 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/a.db-journal\
185d0 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e  x00/home/bill/b.
185e0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a  db-journal\x00".
185f0 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a  **.** A master j
18600 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
18610 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20  only be deleted 
18620 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  once all of its 
18630 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61  child .** journa
18640 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c  ls have been rol
18650 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
18660 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
18670 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ads the contents
18680 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
18690 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
186a0 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
186b0 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61  loops through ea
186c0 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
186d0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46  journal names. F
186e0 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64  or.** each child
186f0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65   journal, it che
18700 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  cks if:.**.**   
18710 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
18720 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61  ournal exists, a
18730 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20  nd if so.**   * 
18740 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
18750 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  rnal contains a 
18760 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73  reference to mas
18770 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  ter journal .** 
18780 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72      file zMaster
18790 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c  .**.** If a chil
187a0 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
187b0 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63   found that matc
187c0 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20  hes both of the 
187d0 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76  criteria.** abov
187e0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
187f0 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
18800 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
18810 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
18820 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20  * no such child 
18830 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
18840 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74  ound, file zMast
18850 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  er is deleted fr
18860 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  om.** the file-s
18870 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69  ystem using sqli
18880 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
18890 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
188a0 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20  ror within this 
188b0 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72  function, an err
188c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
188d0 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ned. This.** fun
188e0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
188f0 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
18900 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
18910 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74  ). If an allocat
18920 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  ion.** fails, SQ
18930 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
18940 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
18950 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d  e, if no IO or m
18960 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a  alloc errors .**
18970 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
18980 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
18990 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  *.** TODO: This 
189a0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
189b0 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63  es a single bloc
189c0 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c  k of memory to l
189d0 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  oad.** the entir
189e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
189f0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18a00 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c   file. This coul
18a10 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65  d be.** a couple
18a20 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72   of kilobytes or
18a30 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c   so - potentiall
18a40 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  y larger than th
18a50 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e  e page .** size.
18a60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18a70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
18a80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
18a90 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
18aa0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
18ab0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
18ac0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
18ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18ae0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
18af0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
18b00 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20  file *pMaster;  
18b10 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61    /* Malloc'd ma
18b20 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
18b30 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
18b40 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
18b50 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d  pJournal;   /* M
18b60 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f  alloc'd child-jo
18b70 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
18b80 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  iptor */.  char 
18b90 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
18ba0 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
18bb0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
18bc0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
18bd0 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
18be0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
18bf0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
18c00 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
18c10 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
18c20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
18c30 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77  to one journal w
18c40 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f  ithin MJ file */
18c50 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18c60 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ptr;         /* 
18c70 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a  Space to hold MJ
18c80 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61   filename from a
18c90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18ca0 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74  .  int nMasterPt
18cb0 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
18cc0 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  Amount of space 
18cd0 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61  allocated to zMa
18ce0 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20  sterPtr[] */..  
18cf0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
18d00 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
18d10 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
18d20 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
18d30 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
18d40 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
18d50 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18d60 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
18d70 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
18d80 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
18d90 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
18da0 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
18db0 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
18dc0 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
18dd0 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
18de0 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
18df0 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
18e00 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
18e10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
18e20 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
18e30 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
18e40 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
18e50 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
18e60 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
18e70 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d  URNAL);.    rc =
18e80 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
18e90 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d  Vfs, zMaster, pM
18ea0 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29  aster, flags, 0)
18eb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
18ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
18ed0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18ee0 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65  .  /* Load the e
18ef0 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
18f00 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
18f10 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
18f20 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  om.  ** sqlite3_
18f30 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69  malloc() and poi
18f40 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
18f50 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73  erJournal.   Als
18f60 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75  o obtain.  ** su
18f70 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28  fficient space (
18f80 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74  in zMasterPtr) t
18f90 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73  o hold the names
18fa0 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20   of master.  ** 
18fb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78  journal files ex
18fc0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67  tracted from reg
18fd0 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  ular rollback-jo
18fe0 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72  urnals..  */.  r
18ff0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
19000 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
19010 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
19020 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19030 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
19040 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61  aster_out;.  nMa
19050 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e  sterPtr = pVfs->
19060 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
19070 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
19080 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
19090 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20  MasterJournal + 
190a0 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b  nMasterPtr + 1);
190b0 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a  .  if( !zMasterJ
190c0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63  ournal ){.    rc
190d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
190e0 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73  .    goto delmas
190f0 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a  ter_out;.  }.  z
19100 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
19110 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
19120 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20  terJournal+1];. 
19130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
19140 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
19150 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e  sterJournal, (in
19160 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
19170 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
19180 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
19190 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
191a0 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
191b0 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
191c0 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61   = 0;..  zJourna
191d0 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
191e0 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a  al;.  while( (zJ
191f0 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
19200 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
19210 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
19220 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20   exists;.    rc 
19230 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
19240 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
19250 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
19260 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
19270 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
19280 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19290 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
192a0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
192b0 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
192c0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
192d0 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
192e0 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
192f0 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
19300 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  s..      ** Open
19310 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
19320 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
19330 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19340 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f  . If.      ** so
19350 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
19360 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
19370 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19380 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
19390 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69    int c;.      i
193a0 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
193b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
193c0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
193d0 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
193e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
193f0 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
19400 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
19410 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
19420 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19430 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
19440 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19450 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19460 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
19470 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
19480 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
19490 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
194a0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
194b0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
194c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
194d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
194e0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
194f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19500 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
19510 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
19520 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
19530 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66  er)==0;.      if
19540 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ( c ){.        /
19550 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
19560 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
19570 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19580 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
19590 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
195a0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
195b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72  .    }.    zJour
195c0 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
195d0 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
195e0 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71  )+1);.  }. .  sq
195f0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19600 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ster);.  rc = sq
19610 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
19620 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
19630 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
19640 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19650 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
19660 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
19670 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
19680 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
19690 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
196a0 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
196b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
196c0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
196d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
196e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
196f0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
19700 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
19710 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
19720 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
19730 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
19740 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
19750 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
19760 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
19770 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
19780 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
19790 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
197a0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
197b0 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
197c0 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
197d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
197e0 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65  not open, or the
197f0 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
19800 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44   either.** DBMOD
19810 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
19820 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
19830 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
19840 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a  ise, the size .*
19850 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
19860 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
19870 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
19880 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19890 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74  bytes). .** If t
198a0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
198b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72  is currently lar
198c0 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70  ger than nPage p
198d0 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74  ages, then use t
198e0 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63  he VFS.** xTrunc
198f0 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20  ate() method to 
19900 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a  truncate it..**.
19910 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20  ** Or, it might 
19920 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
19930 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
19940 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
19950 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
19960 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
19970 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
19980 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
19990 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
199a0 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
199b0 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
199c0 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
199d0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
199e0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
199f0 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
19a00 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
19a10 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
19a20 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
19a30 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
19a40 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
19a50 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
19a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19a70 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
19a80 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
19a90 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
19aa0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
19ab0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
19ac0 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
19ad0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
19ae0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
19af0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
19b00 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
19b10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19b20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19b30 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
19b40 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
19b50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
19b60 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45  ate!=PAGER_READE
19b70 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73  R );.  .  if( is
19b80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
19b90 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d   .   && (pPager-
19ba0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
19bb0 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
19bc0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
19bd0 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b  AGER_OPEN) .  ){
19be0 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
19bf0 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
19c00 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20     int szPage = 
19c10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19c20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
19c30 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
19c40 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
19c50 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
19c60 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
19c70 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
19c80 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
19c90 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
19ca0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
19cb0 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
19cc0 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61    newSize = szPa
19cd0 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20  ge*(i64)nPage;. 
19ce0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19cf0 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53  E_OK && currentS
19d00 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ize!=newSize ){.
19d10 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e        if( curren
19d20 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
19d30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
19d40 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
19d50 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
19d60 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
19d70 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53 69  e if( (currentSi
19d80 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53  ze+szPage)<=newS
19d90 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ize ){.        c
19da0 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67  har *pTmp = pPag
19db0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
19dc0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54         memset(pT
19dd0 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a  mp, 0, szPage);.
19de0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
19df0 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
19e00 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a  e) == currentSiz
19e10 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  e );.        tes
19e20 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
19e30 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65  szPage) >  curre
19e40 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
19e50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19e60 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
19e70 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20  , pTmp, szPage, 
19e80 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b  newSize-szPage);
19e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
19ea0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
19ec0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
19ed0 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
19ee0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19ef0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19f00 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a  Return a sanitiz
19f10 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
19f20 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66  e sector-size of
19f30 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20   OS file pFile. 
19f40 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
19f50 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  lue is guarantee
19f60 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e  d to lie between
19f70 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54   32 and MAX_SECT
19f80 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20  OR_SIZE..*/.int 
19f90 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a  sqlite3SectorSiz
19fa0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
19fb0 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52  pFile){.  int iR
19fc0 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  et = sqlite3OsSe
19fd0 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b  ctorSize(pFile);
19fe0 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20 29  .  if( iRet<32 )
19ff0 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31 32  {.    iRet = 512
1a000 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52  ;.  }else if( iR
1a010 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  et>MAX_SECTOR_SI
1a020 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE ){.    assert
1a030 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  ( MAX_SECTOR_SIZ
1a040 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52  E>=512 );.    iR
1a050 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f  et = MAX_SECTOR_
1a060 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SIZE;.  }.  retu
1a070 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iRet;.}../*.*
1a080 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
1a090 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63  of the Pager.sec
1a0a0 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
1a0b0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
1a0c0 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e  * pager based on
1a0d0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1a0e0 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1a0f0 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a  orSize method.**
1a100 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74   of the open dat
1a110 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1a120 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
1a130 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   be used .** to 
1a140 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
1a150 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74  ze and alignment
1a160 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
1a170 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65  er and .** maste
1a180 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
1a190 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65  rs within create
1a1a0 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  d journal files.
1a1b0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
1a1c0 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65  rary files the e
1a1d0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1a1e0 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35  size is always 5
1a1f0 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  12 bytes..**.** 
1a200 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e  Otherwise, for n
1a210 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  on-temporary fil
1a220 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76  es, the effectiv
1a230 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1a240 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1a250 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
1a260 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68  ectorSize() meth
1a270 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  od rounded up to
1a280 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20   32 if.** it is 
1a290 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72  less than 32, or
1a2a0 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f   rounded down to
1a2b0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a2c0 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65   if it.** is gre
1a2d0 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45  ater than MAX_SE
1a2e0 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a  CTOR_SIZE..**.**
1a2f0 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   If the file has
1a300 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
1a310 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1a320 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20  WRITE property, 
1a330 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20  then set.** the 
1a340 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a350 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e   size to its min
1a360 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29  imum value (512)
1a370 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
1a380 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63  f.** pPager->sec
1a390 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65  torSize is to de
1a3a0 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20  fine the "blast 
1a3b0 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73  radius" of bytes
1a3c0 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1a3d0 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68  hange if a crash
1a3e0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72   occurs while wr
1a3f0 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c  iting to a singl
1a400 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61  e byte in.** tha
1a410 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69  t range.  But wi
1a420 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  th POWERSAFE_OVE
1a430 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73  RWRITE, the blas
1a440 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f  t radius is zero
1a450 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61  .** (that is wha
1a460 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  t POWERSAFE_OVER
1a470 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f  WRITE means), so
1a480 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   we minimize the
1a490 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e   sector.** size.
1a4a0 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20    For backwards 
1a4b0 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66  compatibility of
1a4c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1a4d0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1a4e0 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20  t,.** we cannot 
1a4f0 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
1a500 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a510 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73   below 512..*/.s
1a520 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
1a530 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
1a540 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
1a550 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1a560 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1a570 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
1a580 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
1a590 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69  File.   || (sqli
1a5a0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1a5b0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1a5c0 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20  r->fd) & .      
1a5d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1a5e0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1a5f0 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29  VERWRITE)!=0.  )
1a600 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
1a610 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
1a620 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
1a630 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
1a640 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
1a650 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
1a660 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
1a670 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f  which case the O
1a680 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
1a690 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
1a6a0 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20  egfault. */.    
1a6b0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1a6c0 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  ze = 512;.  }els
1a6d0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
1a6e0 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
1a6f0 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50  te3SectorSize(pP
1a700 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d  ager->fd);.  }.}
1a710 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
1a720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1a730 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
1a740 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a750 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
1a760 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
1a770 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
1a780 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
1a790 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
1a7a0 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
1a7b0 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
1a7c0 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
1a7d0 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
1a7e0 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
1a7f0 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
1a800 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1a810 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1a820 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
1a830 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
1a840 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
1a850 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
1a860 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
1a870 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
1a880 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
1a890 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
1a8a0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
1a8b0 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
1a8c0 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
1a8d0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a8e0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
1a8f0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
1a900 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
1a910 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
1a920 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
1a930 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1a940 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1a950 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
1a960 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
1a970 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
1a980 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
1a990 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
1a9a0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1a9b0 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
1a9c0 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
1a9d0 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
1a9e0 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
1a9f0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
1aa00 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
1aa10 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1aa20 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
1aa30 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
1aa40 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
1aa50 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
1aa60 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
1aa70 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
1aa80 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
1aa90 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
1aaa0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1aab0 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
1aac0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
1aad0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1aae0 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
1aaf0 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1ab00 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
1ab10 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
1ab20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
1ab30 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
1ab40 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
1ab50 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
1ab60 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
1ab70 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
1ab80 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
1ab90 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
1aba0 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
1abb0 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
1abc0 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
1abd0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
1abe0 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
1abf0 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
1ac00 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
1ac10 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
1ac20 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
1ac30 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
1ac40 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1ac50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
1ac60 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
1ac70 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
1ac80 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
1ac90 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
1aca0 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
1acb0 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
1acc0 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
1acd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ace0 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
1acf0 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
1ad00 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
1ad10 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
1ad20 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
1ad30 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
1ad40 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
1ad50 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
1ad60 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
1ad70 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
1ad80 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
1ad90 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1ada0 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1adb0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1adc0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1add0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1ade0 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1adf0 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1ae00 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1ae10 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1ae20 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1ae30 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1ae40 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1ae50 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1ae60 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1ae70 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1ae80 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1ae90 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1aea0 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1aeb0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1aec0 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1aed0 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1aee0 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1aef0 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1af00 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1af10 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1af20 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1af30 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1af40 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1af50 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1af60 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1af70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1af80 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1af90 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1afa0 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1afb0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1afc0 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1afd0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1afe0 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1aff0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1b000 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1b010 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1b020 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1b030 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1b040 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1b050 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1b060 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1b070 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1b080 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1b090 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1b0a0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1b0b0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1b0c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1b0d0 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1b0e0 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1b0f0 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1b100 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1b110 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1b120 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1b130 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1b140 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1b150 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1b160 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1b170 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1b180 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1b190 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1b1a0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1b1b0 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1b1c0 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1b1d0 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1b1e0 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1b1f0 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1b200 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1b210 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1b220 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1b230 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1b240 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1b250 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1b260 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1b270 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1b280 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1b290 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2b0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1b2c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1b2d0 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1b2e0 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1b2f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b300 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1b310 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1b320 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1b330 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1b340 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1b350 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1b360 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1b370 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1b380 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1b390 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3b0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1b3c0 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1b3d0 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b3f0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1b400 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1b410 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1b420 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1b430 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1b440 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b450 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1b460 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1b470 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1b480 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1b490 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1b4a0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  rollback */.  in
1b4b0 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b  t nPlayback = 0;
1b4c0 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1b4d0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1b4e0 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f  restored from jo
1b4f0 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46  urnal */..  /* F
1b500 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
1b510 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
1b520 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1b530 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
1b540 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
1b550 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
1b560 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1b570 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
1b580 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b590 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1b5a0 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
1b5b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b5c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1b5d0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
1b5e0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
1b5f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
1b600 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
1b610 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
1b620 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
1b630 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1b640 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
1b650 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
1b660 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
1b670 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
1b680 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1b690 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
1b6a0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1b6b0 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
1b6c0 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   back..  **.  **
1b6d0 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c   TODO: Technical
1b6e0 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
1b6f0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63   is an error bec
1b700 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20  ause it assumes 
1b710 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  that.  ** buffer
1b720 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
1b730 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b   is (mxPathname+
1b740 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67  1) bytes or larg
1b750 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20  er. i.e. that.  
1b760 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ** (pPager->page
1b770 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e  Size >= pPager->
1b780 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1b790 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e  +1). Using os_un
1b7a0 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61  ix.c,.  **  mxPa
1b7b0 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77  thname is 512, w
1b7c0 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65  hich is the same
1b7d0 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   as the minimum 
1b7e0 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a  allowable value.
1b7f0 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a    ** for pageSiz
1b800 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  e..  */.  zMaste
1b810 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1b820 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
1b830 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1b840 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1b850 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1b860 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1b870 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1b880 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1b890 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
1b8a0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1b8b0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1b8c0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1b8d0 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
1b8e0 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
1b8f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b900 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
1b910 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1b920 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
1b930 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1b940 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52   0;.  needPagerR
1b950 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20  eset = isHot;.. 
1b960 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
1b970 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
1b980 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e  when a readJourn
1b990 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a  alHdr() or .  **
1b9a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1b9b0 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20  one_page() call 
1b9c0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1b9d0 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
1b9e0 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e  or .  ** occurs.
1b9f0 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20   .  */.  while( 
1ba00 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64  1 ){.    /* Read
1ba10 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
1ba20 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
1ba30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1ba40 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
1ba50 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
1ba60 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
1ba70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1ba80 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
1ba90 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
1baa0 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
1bab0 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
1bac0 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1bad0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
1bae0 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
1baf0 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
1bb00 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
1bb10 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
1bb20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
1bb30 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
1bb40 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a  ager, isHot, szJ
1bb50 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
1bb60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1bb70 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
1bb80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bb90 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1bba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1bbb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1bbc0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1bbd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1bbe0 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
1bbf0 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
1bc00 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
1bc10 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1bc20 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
1bc30 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
1bc40 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1bc50 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1bc60 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1bc70 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
1bc80 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
1bc90 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
1bca0 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
1bcb0 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
1bcc0 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
1bcd0 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
1bce0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1bcf0 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
1bd00 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
1bd10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1bd20 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1bd30 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1bd40 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
1bd50 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a  = (int)((szJ - J
1bd60 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1bd70 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
1bd80 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1bd90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1bda0 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
1bdb0 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
1bdc0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1bdd0 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
1bde0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
1bdf0 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
1be00 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
1be10 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
1be20 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
1be30 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
1be40 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1be50 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
1be60 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
1be70 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
1be80 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
1be90 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
1bea0 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
1beb0 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
1bec0 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
1bed0 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
1bee0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
1bef0 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
1bf00 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
1bf10 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
1bf20 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20  65..    ** When 
1bf30 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
1bf40 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63  ot journal, nRec
1bf50 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73  ==0 always means
1bf60 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20   that the next. 
1bf70 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74     ** chunk of t
1bf80 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
1bf90 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74  ins zero pages t
1bfa0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1bfb0 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68  .  But.    ** wh
1bfc0 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42  en doing a ROLLB
1bfd0 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63  ACK and the nRec
1bfe0 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65  ==0 chunk is the
1bff0 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20   last chunk in. 
1c000 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
1c010 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1c020 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1c030 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74  ht contain addit
1c040 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67  ional.    ** pag
1c050 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
1c060 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
1c070 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  nd that the numb
1c080 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20  er of pages .   
1c090 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f   ** should be co
1c0a0 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20  mputed based on 
1c0b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c0c0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1c0d0 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
1c0e0 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
1c0f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1c100 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
1c110 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
1c120 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c130 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
1c140 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
1c150 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c160 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
1c170 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1c180 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1c190 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
1c1a0 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
1c1b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
1c1c0 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
1c1d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
1c1e0 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
1c1f0 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
1c200 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1c210 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
1c220 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1c230 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
1c240 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
1c250 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
1c260 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c280 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c290 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
1c2a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1c2b0 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
1c2c0 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
1c2d0 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
1c2e0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1c2f0 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
1c300 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
1c310 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70  se file and/or p
1c320 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  age cache..    *
1c330 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
1c340 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
1c350 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72     if( needPager
1c360 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  Reset ){.       
1c370 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1c380 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ger);.        ne
1c390 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30  edPagerReset = 0
1c3a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c3b0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1c3c0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
1c3d0 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75  ger,&pPager->jou
1c3e0 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a  rnalOff,0,1,0);.
1c3f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c410 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a     nPlayback++;.
1c420 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c430 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c440 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1c450 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1c460 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
1c470 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c480 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1c490 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1c4a0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1c4b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1c4c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  f the journal ha
1c4d0 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64  s been truncated
1c4e0 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65  , simply stop re
1c4f0 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  ading and.      
1c500 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
1c510 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  g the journal. T
1c520 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1c530 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1c540 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1c550 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
1c560 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
1c570 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72  ed prior to a cr
1c580 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ash.  In that.  
1c590 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c          ** case,
1c5a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
1c5b0 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20  ould have never 
1c5c0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20  been written in 
1c5d0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1c5e0 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20   first place so 
1c5f0 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70  it is OK to simp
1c600 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  ly abandon the r
1c610 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20  ollback. */.    
1c620 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c630 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
1c640 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c650 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1c660 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1c670 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
1c680 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
1c690 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
1c6a0 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1c6b0 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
1c6c0 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
1c6d0 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
1c6e0 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
1c6f0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
1c700 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
1c710 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
1c720 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
1c730 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
1c740 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
1c750 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
1c760 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
1c770 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
1c780 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1c790 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1c7a0 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1c7b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c7c0 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
1c7d0 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
1c7e0 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
1c7f0 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
1c800 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
1c810 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1c820 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
1c830 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
1c840 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
1c850 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1c860 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
1c870 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
1c880 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1c890 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
1c8a0 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
1c8b0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
1c8c0 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
1c8d0 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1c8e0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
1c8f0 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23  modified..  */.#
1c900 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c910 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  UG.  if( pPager-
1c920 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1c930 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
1c940 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
1c950 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1c960 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1c970 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ED,0);.  }.#endi
1c980 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  f..  /* If this 
1c990 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1c9a0 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1c9b0 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1c9c0 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1c9d0 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1c9e0 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1c9f0 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1ca00 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1ca10 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1ca20 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1ca30 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1ca40 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1ca50 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1ca60 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1ca70 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1ca80 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1ca90 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1caa0 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1cab0 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1cac0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1cad0 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1cae0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1caf0 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1cb00 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1cb10 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1cb20 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1cb30 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1cb40 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1cb50 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1cb60 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1cb70 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1cb80 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1cb90 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1cba0 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1cbb0 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1cbc0 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1cbd0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1cbe0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1cbf0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1cc00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cc10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1cc20 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1cc30 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1cc40 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1cc50 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1cc60 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1cc70 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1cc80 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1cc90 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1cca0 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1ccb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1ccc0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1ccd0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1cce0 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1ccf0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1cd00 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1cd10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1cd20 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29  rSync(pPager, 0)
1cd30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1cd40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cd50 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1cd60 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1cd70 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1cd80 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1cd90 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1cda0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1cdb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cdc0 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1cdd0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1cde0 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1cdf0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1ce00 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1ce10 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1ce20 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1ce30 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1ce40 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1ce50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1ce60 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1ce70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1ce80 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1ce90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1cea0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1ceb0 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1cec0 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1ced0 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1cee0 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1cef0 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1cf00 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1cf10 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1cf30 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1cf40 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1cf50 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1cf60 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1cf70 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1cf80 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1cf90 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1cfa0 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1cfb0 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1cfc0 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1cfd0 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1cfe0 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1cff0 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1d000 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1d010 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1d020 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1d030 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1d040 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1d050 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1d060 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1d070 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d080 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
1d090 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
1d0a0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
1d0b0 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
1d0c0 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1d0d0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
1d0e0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1d0f0 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1d100 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
1d110 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
1d120 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
1d130 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
1d140 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
1d150 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1d160 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1d170 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
1d180 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1d190 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
1d1a0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1d1b0 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
1d1c0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1d1d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1d1e0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1d1f0 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
1d200 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a  g, u32 iFrame){.
1d210 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1d220 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1d230 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1d240 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1d250 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
1d260 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
1d270 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
1d280 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
1d290 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1d2a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1d2b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1d2c0 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1d2d0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1d2e0 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1d2f0 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1d300 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1d310 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1d320 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1d330 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1d340 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1d350 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  fd) );..#ifndef 
1d360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1d370 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a    if( iFrame ){.
1d380 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
1d390 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
1d3a0 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
1d3b0 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
1d3c0 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1d3d0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1d3e0 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a  al, iFrame, pgsz
1d3f0 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
1d400 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1d410 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1d420 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1d430 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1d440 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
1d450 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1d460 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1d470 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74  a, pgsz, iOffset
1d480 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d490 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1d4a0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1d4b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d4c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1d4d0 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1d4e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1d4f0 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69  /* If the read i
1d500 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  s unsuccessful, 
1d510 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65  set the dbFileVe
1d520 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e  rs[] to somethin
1d530 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  g.      ** that 
1d540 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20  will never be a 
1d550 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69  valid file versi
1d560 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b  on.  dbFileVers[
1d570 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20  ] is a copy.    
1d580 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34    ** of bytes 24
1d590 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1d5a0 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e  base.  Bytes 28.
1d5b0 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  .31 should alway
1d5c0 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65  s be.      ** ze
1d5d0 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  ro or the size o
1d5e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1d5f0 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32  n page. Bytes 32
1d600 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a  ..35 and 35..39.
1d610 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
1d620 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  be page numbers 
1d630 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
1d640 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20  0xffffffff.  So 
1d650 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  filling.      **
1d660 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56   pPager->dbFileV
1d670 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30  ers[] with all 0
1d680 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64  xff bytes should
1d690 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20   suffice..      
1d6a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
1d6b0 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
1d6c0 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61  abase, the situa
1d6d0 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d  tion is more com
1d6e0 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20  plex:  bytes.   
1d6f0 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20     ** 24..39 of 
1d700 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
1d710 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42   white noise.  B
1d720 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  ut the probabili
1d730 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ty of.      ** w
1d740 68 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c  hite noise equal
1d750 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
1d760 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
1d770 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
1d780 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
1d790 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
1d7a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
1d7b0 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
1d7c0 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
1d7d0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1d7e0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
1d7f0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
1d800 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
1d810 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
1d820 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
1d830 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1d840 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1d850 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1d860 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1d870 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
1d880 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
1d890 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
1d8a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1d8b0 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
1d8c0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1d8d0 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1d8e0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1d8f0 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1d900 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1d910 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1d920 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
1d930 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61  CE(("FETCH %d pa
1d940 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
1d950 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d960 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1d970 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
1d980 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
1d990 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1d9a0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
1d9b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1d9c0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1d9d0 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e  at offsets 24 an
1d9e0 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68  d 92 in.** the h
1d9f0 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73 71  eader and the sq
1da00 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  lite version num
1da10 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36  ber at offset 96
1da20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1da30 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c  an unconditional
1da40 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c   update.  See al
1da50 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63  so the pager_inc
1da60 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1da70 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69  ).** routine whi
1da80 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20  ch only updates 
1da90 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1daa0 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74 65  er if the update
1dab0 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20   is actually.** 
1dac0 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65 72  needed, as deter
1dad0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50 61  mined by the pPa
1dae0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1daf0 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69 61  Done state varia
1db00 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1db10 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f  oid pager_write_
1db20 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67  changecounter(Pg
1db30 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32  Hdr *pPg){.  u32
1db40 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1db50 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
1db60 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
1db70 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
1db80 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
1db90 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63  4. */.  change_c
1dba0 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
1dbb0 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50  Get4byte((u8*)pP
1dbc0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  g->pPager->dbFil
1dbd0 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33  eVers)+1;.  put3
1dbe0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1dbf0 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  g->pData)+24, ch
1dc00 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
1dc10 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20    /* Also store 
1dc20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
1dc30 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74  on number in byt
1dc40 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e  es 96..99 and in
1dc50 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e  .  ** bytes 92..
1dc60 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61  95 store the cha
1dc70 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20  nge counter for 
1dc80 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f  which the versio
1dc90 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73  n number.  ** is
1dca0 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74   valid. */.  put
1dcb0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1dcc0 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63  Pg->pData)+92, c
1dcd0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1dce0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1dcf0 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1dd00 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49  96, SQLITE_VERSI
1dd10 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23  ON_NUMBER);.}..#
1dd20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1dd30 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_WAL./*.** Thi
1dd40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
1dd50 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  voked once for e
1dd60 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61  ach page that ha
1dd70 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a  s already been .
1dd80 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
1dd90 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65  the log file whe
1dda0 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74  n a WAL transact
1ddb0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1ddc0 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ck..** Parameter
1ddd0 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65   iPg is the page
1dde0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20   number of said 
1ddf0 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61  page. The pCtx a
1de00 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61  rgument .** is a
1de10 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  ctually a pointe
1de20 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
1de30 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
1de40 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70  If page iPg is p
1de50 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61  resent in the ca
1de60 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20  che, and has no 
1de70 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
1de80 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73  rences,.** it is
1de90 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65   discarded. Othe
1dea0 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20  rwise, if there 
1deb0 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
1dec0 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72  outstanding.** r
1ded0 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70  eferences, the p
1dee0 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72  age content is r
1def0 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65  eloaded from the
1df00 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
1df10 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  e.** attempt to 
1df20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66  reload content f
1df30 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1df40 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64   is required and
1df50 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75   fails, .** retu
1df60 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
1df70 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
1df80 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
1df90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1dfa0 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76  erUndoCallback(v
1dfb0 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20  oid *pCtx, Pgno 
1dfc0 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  iPg){.  int rc =
1dfd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1dfe0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1dff0 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50  ager *)pCtx;.  P
1e000 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
1e010 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1e020 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  l(pPager) );.  p
1e030 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
1e040 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
1e050 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20  iPg);.  if( pPg 
1e060 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1e070 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
1e080 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a  ount(pPg)==1 ){.
1e090 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
1e0a0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
1e0b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
1e0c0 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20  32 iFrame = 0;. 
1e0d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e0e0 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
1e0f0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d  ager->pWal, pPg-
1e100 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b  >pgno, &iFrame);
1e110 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1e120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e130 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
1e140 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29  age(pPg, iFrame)
1e150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e170 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1e180 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
1e190 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1e1a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1e1b0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29  nrefNotNull(pPg)
1e1c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1e1d0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1e1e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1e1f0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
1e200 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1e210 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
1e220 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
1e230 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
1e240 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1e250 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
1e260 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
1e270 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
1e280 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
1e290 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
1e2a0 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
1e2b0 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
1e2c0 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
1e2d0 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
1e2e0 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
1e2f0 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
1e300 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1e310 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1e320 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
1e330 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
1e340 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
1e350 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
1e360 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
1e370 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
1e380 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
1e390 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
1e3a0 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
1e3b0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
1e3c0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
1e3d0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1e3e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1e3f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1e400 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
1e410 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
1e420 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
1e430 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e440 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
1e450 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1e460 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e480 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1e490 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4b0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
1e4c0 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
1e4d0 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
1e4e0 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
1e4f0 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
1e500 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
1e510 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
1e520 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
1e530 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
1e540 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
1e550 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
1e560 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
1e570 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
1e580 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
1e590 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
1e5a0 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
1e5b0 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
1e5c0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
1e5d0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1e5e0 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
1e5f0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1e600 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1e610 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
1e620 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
1e630 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
1e640 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1e650 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
1e660 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
1e670 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1e680 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1e690 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
1e6a0 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
1e6b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
1e6c0 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
1e6d0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
1e6e0 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
1e6f0 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
1e700 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1e710 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
1e720 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
1e730 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e740 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e750 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
1e760 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
1e770 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
1e780 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
1e790 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1e7a0 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
1e7b0 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
1e7c0 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
1e7d0 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
1e7e0 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
1e7f0 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
1e800 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
1e810 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
1e820 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
1e830 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f  **.** The list o
1e840 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69  f pages passed i
1e850 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
1e860 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65   is always sorte
1e870 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  d by page number
1e880 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70  ..** Hence, if p
1e890 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e  age 1 appears an
1e8a0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69  ywhere on the li
1e8b0 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74  st, it will be t
1e8c0 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a  he first page..*
1e8d0 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
1e8e0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
1e8f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e910 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1e920 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1e930 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1e940 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1e950 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
1e960 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
1e970 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1e980 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1e990 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
1e9a0 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
1e9b0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1e9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e9d0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1e9e0 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  commit */.){.  i
1e9f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ea10 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1ea20 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20  .  int nList;   
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ea50 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a  pages in pList *
1ea60 2f 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  /.  PgHdr *p;   
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1ea90 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f  ng over pages */
1eaa0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1eab0 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73  er->pWal );.  as
1eac0 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23  sert( pList );.#
1ead0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1eae0 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
1eaf0 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73  hat the page lis
1eb00 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  t is in accendin
1eb10 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72  g order */.  for
1eb20 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70  (p=pList; p && p
1eb30 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70  ->pDirty; p=p->p
1eb40 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65  Dirty){.    asse
1eb50 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d  rt( p->pgno < p-
1eb60 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b  >pDirty->pgno );
1eb70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1eb80 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44  ssert( pList->pD
1eb90 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d  irty==0 || isCom
1eba0 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43  mit );.  if( isC
1ebb0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ommit ){.    /* 
1ebc0 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  If a WAL transac
1ebd0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f  tion is being co
1ebe0 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69  mmitted, there i
1ebf0 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72  s no point in wr
1ec00 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79  iting.    ** any
1ec10 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
1ec20 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
1ec30 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20   than nTruncate 
1ec40 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  into the WAL fil
1ec50 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77  e..    ** They w
1ec60 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61  ill never be rea
1ec70 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e  d by any client.
1ec80 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20   So remove them 
1ec90 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a  from the pDirty.
1eca0 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65      ** list here
1ecb0 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a  . */.    PgHdr *
1ecc0 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74  *ppNext = &pList
1ecd0 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b  ;.    nList = 0;
1ece0 0a 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  ..    for(p=pLis
1ecf0 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29  t; (*ppNext = p)
1ed00 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  !=0; p=p->pDirty
1ed10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1ed20 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20  pgno<=nTruncate 
1ed30 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78  ){.        ppNex
1ed40 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a  t = &p->pDirty;.
1ed50 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b          nList++;
1ed60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ed70 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
1ed80 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1ed90 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a   nList = 1;.  }.
1eda0 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
1edb0 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
1edc0 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69  ] += nList;..  i
1edd0 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
1ede0 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f  1 ) pager_write_
1edf0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c  changecounter(pL
1ee00 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ist);.  rc = sql
1ee10 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50  ite3WalFrames(pP
1ee20 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20  ager->pWal, .   
1ee30 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
1ee40 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75  ize, pList, nTru
1ee50 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c  ncate, isCommit,
1ee60 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
1ee70 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28  Flags.  );.  if(
1ee80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ee90 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  & pPager->pBacku
1eea0 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70  p ){.    for(p=p
1eeb0 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
1eec0 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c  irty){.      sql
1eed0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
1eee0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
1eef0 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a  , p->pgno, (u8 *
1ef00 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  )p->pData);.    
1ef10 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
1ef20 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1ef30 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1ef40 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1ef50 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1ef60 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73  e);.  for(p=pLis
1ef70 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1ef80 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65  y){.    pager_se
1ef90 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20  t_pagehash(p);. 
1efa0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
1efb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1efc0 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72   Begin a read tr
1efd0 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1efe0 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   WAL..**.** This
1eff0 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f   routine used to
1f000 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65   be called "page
1f010 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22  rOpenSnapshot()"
1f020 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65   because it esse
1f030 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73  ntially.** makes
1f040 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74   a snapshot of t
1f050 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  he database at t
1f060 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74  he current point
1f070 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65   in time and pre
1f080 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73  serves.** that s
1f090 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20  napshot for use 
1f0a0 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e  by the reader in
1f0b0 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72   spite of concur
1f0c0 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62  rently changes b
1f0d0 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65  y.** other write
1f0e0 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  rs or checkpoint
1f0f0 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
1f100 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  nt pagerBeginRea
1f110 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  dTransaction(Pag
1f120 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1f130 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f150 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1f160 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d  .  int changed =
1f170 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f180 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
1f190 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65  che must be rese
1f1a0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
1f1b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1f1c0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
1f1d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f1e0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
1f1f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1f200 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a  AGER_READER );..
1f210 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45    /* sqlite3WalE
1f220 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1f230 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  n() was not call
1f240 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ed for the previ
1f250 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ous.  ** transac
1f260 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  tion in locking_
1f270 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20  mode=EXCLUSIVE. 
1f280 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e   So call it now.
1f290 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65    If we.  ** are
1f2a0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1f2b0 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52  =NORMAL and EndR
1f2c0 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f  ead() was previo
1f2d0 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a  usly called,.  *
1f2e0 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  * the duplicate 
1f2f0 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73  call is harmless
1f300 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1f310 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1f320 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
1f330 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  al);..  rc = sql
1f340 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64  ite3WalBeginRead
1f350 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1f360 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67  er->pWal, &chang
1f370 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ed);.  if( rc!=S
1f380 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e  QLITE_OK || chan
1f390 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72  ged ){.    pager
1f3a0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1f3b0 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48      if( USEFETCH
1f3c0 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74  (pPager) ) sqlit
1f3d0 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
1f3e0 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
1f3f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1f400 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1f410 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1f420 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
1f430 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
1f440 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50  on from PAGER_OP
1f450 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52  EN.** to PAGER_R
1f460 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64  EADER state to d
1f470 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1f480 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1f490 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67  e file.** in pag
1f4a0 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  es (assuming the
1f4b0 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65   page size curre
1f4c0 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50  ntly stored in P
1f4d0 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a  ager.pageSize)..
1f4e0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
1f4f0 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
1f500 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1f510 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1f520 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1f530 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72  in pages is stor
1f540 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f  ed in *pnPage. O
1f550 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
1f560 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73  or code (perhaps
1f570 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
1f580 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72  _FSTAT) is retur
1f590 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
1f5a0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
1f5b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1f5c0 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  t pagerPagecount
1f5d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1f5e0 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20  Pgno *pnPage){. 
1f5f0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f610 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1f620 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
1f630 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74  */..  /* Query t
1f640 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1f650 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  m for the databa
1f660 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c  se size. The Wal
1f670 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75  Dbsize().  ** fu
1f680 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a  nction returns z
1f690 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69  ero if the WAL i
1f6a0 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e  s not open (i.e.
1f6b0 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c   Pager.pWal==0),
1f6c0 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20   or.  ** if the 
1f6d0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1f6e0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
1f6f0 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1f700 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76  e is not.  ** av
1f710 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1f720 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
1f730 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  if the log file 
1f740 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a  is empty or.  **
1f750 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c   contains no val
1f760 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61  id committed tra
1f770 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  nsactions..  */.
1f780 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f790 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f7a0 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1f7b0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1f7c0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1f7d0 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
1f7e0 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65  3WalDbsize(pPage
1f7f0 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20  r->pWal);..  /* 
1f800 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
1f810 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
1f820 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 76  tabase is not av
1f830 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1f840 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79  .  ** WAL sub-sy
1f850 73 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  stem, determine 
1f860 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 65 20  the page counte 
1f870 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a  based on the siz
1f880 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61  e of.  ** the da
1f890 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
1f8a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f8b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1f8c0 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e  s not an.  ** in
1f8d0 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
1f8e0 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
1f8f0 20 72 6f 75 6e 64 20 75 70 20 74 68 65 20 72 65   round up the re
1f900 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
1f910 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1f920 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f940 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * Size of db fil
1f950 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1f960 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1f970 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1f980 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1f990 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
1f9a0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1f9b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
1f9c0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1f9d0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
1f9e0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
1f9f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1fa00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1fa10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fa20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1fa30 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61  o)((n+pPager->pa
1fa40 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67  geSize-1) / pPag
1fa50 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1fa60 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1fa70 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
1fa80 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1fa90 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ile is greater t
1faa0 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  han the.  ** con
1fab0 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
1fac0 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
1fad0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
1fae0 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
1faf0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
1fb00 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
1fb10 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
1fb20 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1fb30 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
1fb40 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
1fb50 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20  .  }..  *pnPage 
1fb60 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1fb70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1fb80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fb90 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68  MIT_WAL./*.** Ch
1fba0 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c  eck if the *-wal
1fbb0 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65   file that corre
1fbc0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61  sponds to the da
1fbd0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1fbe0 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74   pPager.** exist
1fbf0 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  s if the databas
1fc00 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f  e is not empy, o
1fc10 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  r verify that th
1fc20 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
1fc30 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28  s.** not exist (
1fc40 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20  by deleting it) 
1fc50 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1fc60 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  file is empty..*
1fc70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1fc80 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74  base is not empt
1fc90 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20  y and the *-wal 
1fca0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65  file exists, ope
1fcb0 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69  n the pager.** i
1fcc0 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20  n WAL mode.  If 
1fcd0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1fce0 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a  empty or if no *
1fcf0 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
1fd00 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72   and.** if no er
1fd10 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  ror occurs, make
1fd20 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
1fd30 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
1fd40 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a  et to.** PAGER_J
1fd50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a  OURNALMODE_WAL..
1fd60 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1fd70 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72  ITE_OK or an err
1fd80 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
1fd90 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68  he caller must h
1fda0 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63  old a SHARED loc
1fdb0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1fdc0 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e file to call t
1fdd0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
1fde0 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c   Because an EXCL
1fdf0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1fe00 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71  e db file is req
1fe10 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20  uired to delete 
1fe20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e  .** a WAL on a n
1fe30 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61  one-empty databa
1fe40 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  se, this ensures
1fe50 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
1fe60 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  e condition .** 
1fe70 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63  between the xAcc
1fe80 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20  ess() below and 
1fe90 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
1fea0 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
1feb0 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f  ome .** other co
1fec0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1fed0 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1fee0 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61  nWalIfPresent(Pa
1fef0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1ff00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ff10 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
1ff20 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1ff30 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1ff40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1ff50 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1ff60 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
1ff70 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1ff80 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20      int isWal;  
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffa0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c    /* True if WAL
1ffb0 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
1ffc0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1fff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
20000 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  /..    rc = page
20010 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
20020 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
20030 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20040 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67  rc;.    if( nPag
20050 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
20060 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
20070 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
20080 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30   pPager->zWal, 0
20090 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
200a0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  =SQLITE_IOERR_DE
200b0 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20  LETE_NOENT ) rc 
200c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
200d0 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20     isWal = 0;.  
200e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
200f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
20100 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70  ess(.          p
20110 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
20120 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54  ger->zWal, SQLIT
20130 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
20140 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b   &isWal.      );
20150 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
20160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20170 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20        if( isWal 
20180 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
20190 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63  ase( sqlite3Pcac
201a0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
201b0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
201c0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
201d0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
201e0 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  Wal(pPager, 0);.
201f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20200 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20210 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
20220 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20  ALMODE_WAL ){.  
20230 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
20240 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
20250 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
20260 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LETE;.      }.  
20270 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20280 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
20290 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61  *.** Playback sa
202a0 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69  vepoint pSavepoi
202b0 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65  nt. Or, if pSave
202c0 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65  point==NULL, the
202d0 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68  n playback.** th
202e0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
202f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
20300 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e  e case pSavepoin
20310 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77  t==NULL occurs w
20320 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41  hen .** a ROLLBA
20330 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73  CK TO command is
20340 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41   invoked on a SA
20350 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20  VEPOINT that is 
20360 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
20370 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a  * savepoint..**.
20380 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69  ** When pSavepoi
20390 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28  nt is not NULL (
203a0 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72  meaning a non-tr
203b0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
203c0 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67  int is .** being
203d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74   rolled back), t
203e0 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
203f0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20   consists of up 
20400 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c  to three stages,
20410 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e  .** performed in
20420 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69   the order speci
20430 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  fied:.**.**   * 
20440 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  Pages are played
20450 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
20460 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
20470 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20  ting at byte.** 
20480 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72      offset Pager
20490 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
204a0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
204b0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65   to .**     Page
204c0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
204d0 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65  ffset, or to the
204e0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
204f0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
20500 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76  file if PagerSav
20510 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20520 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  t is zero..**.**
20530 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76     * If PagerSav
20540 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20550 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
20560 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c  hen pages are pl
20570 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b  ayed.**     back
20580 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74   starting from t
20590 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
205a0 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  r immediately fo
205b0 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20  llowing .**     
205c0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
205d0 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65  HdrOffset to the
205e0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
205f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
20600 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
20610 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62  re then played b
20620 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ack from the sub
20630 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73  -journal file, s
20640 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77  tarting.**     w
20650 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76  ith the PagerSav
20660 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61  epoint.iSubRec a
20670 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
20680 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20   the end of.**  
20690 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
206a0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75  ile..**.** Throu
206b0 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61  ghout the rollba
206c0 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68  ck process, each
206d0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
206e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
206f0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
20700 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
20710 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  a bitvec structu
20720 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f  re (variable pDo
20730 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70  ne in the.** imp
20740 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f  lementation belo
20750 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  w). This is used
20760 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
20770 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a  a page is only.*
20780 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  * rolled back th
20790 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20  e first time it 
207a0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
207b0 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c  n either journal
207c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65  ..**.** If pSave
207d0 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  point is NULL, t
207e0 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e  hen pages are on
207f0 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  ly played back f
20800 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  rom the main.** 
20810 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
20820 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
20830 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74  or a bitvec in t
20840 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
20850 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
20860 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20  before playback 
20870 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61  commences the Pa
20880 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61  ger.dbSize varia
20890 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20  ble.** is reset 
208a0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  to the value tha
208b0 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65  t it held at the
208c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61   start of the sa
208d0 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20  vepoint .** (or 
208e0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f  transaction). No
208f0 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67   page with a pag
20900 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e-number greater
20910 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
20920 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61  .** is played ba
20930 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e  ck. If one is en
20940 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
20950 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a  simply skipped..
20960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20970 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
20980 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
20990 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69  er, PagerSavepoi
209a0 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b  nt *pSavepoint){
209b0 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
209c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
209d0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
209e0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
209f0 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  l */.  i64 iHdrO
20a00 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
20a10 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20  /* End of first 
20a20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d  segment of main-
20a30 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
20a40 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
20a50 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
20a60 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
20a70 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20    Bitvec *pDone 
20a80 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69  = 0;       /* Bi
20a90 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70  tvec to ensure p
20aa0 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b  ages played back
20ab0 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20   only once */.. 
20ac0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20ad0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
20ae0 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
20af0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20b00 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
20b10 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41  OCKED );..  /* A
20b20 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
20b30 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
20b40 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
20b50 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
20b60 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20b70 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
20b80 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
20b90 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
20ba0 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
20bb0 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
20bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
20bd0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
20be0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61  .  /* Set the da
20bf0 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b  tabase size back
20c00 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
20c10 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20   was before the 
20c20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
20c30 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77  being reverted w
20c40 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  as opened..  */.
20c50 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20c60 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20   = pSavepoint ? 
20c70 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
20c80 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  g : pPager->dbOr
20c90 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  igSize;.  pPager
20ca0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
20cb0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
20cc0 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53  File;..  if( !pS
20cd0 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65  avepoint && page
20ce0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20cf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
20d00 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70  gerRollbackWal(p
20d10 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
20d20 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f  * Use pPager->jo
20d30 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20  urnalOff as the 
20d40 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  effective size o
20d50 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  f the main rollb
20d60 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
20d70 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69  .  The actual fi
20d80 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  le might be larg
20d90 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a  er than this in.
20da0 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e    ** PAGER_JOURN
20db0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
20dc0 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  or PAGER_JOURNAL
20dd0 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42  MODE_PERSIST.  B
20de0 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a  ut anything.  **
20df0 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f   past pPager->jo
20e00 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d  urnalOff is off-
20e10 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20  limits to us..  
20e20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  */.  szJ = pPage
20e30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
20e40 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
20e50 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
20e60 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20  || szJ==0 );..  
20e70 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c  /* Begin by roll
20e80 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
20e90 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
20ea0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
20eb0 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  at.  ** PagerSav
20ec0 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
20ed0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
20ee0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
20ef0 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54  l header..  ** T
20f00 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65  here might be re
20f10 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69  cords in the mai
20f20 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68  n journal that h
20f30 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ave a page numbe
20f40 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74  r.  ** greater t
20f50 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
20f60 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70  database size (p
20f70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62  Pager->dbSize) b
20f80 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69  ut those.  ** wi
20f90 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75  ll be skipped au
20fa0 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61  tomatically.  Pa
20fb0 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  ges are added to
20fc0 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20   pDone as they. 
20fd0 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62   ** are played b
20fe0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ack..  */.  if( 
20ff0 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  pSavepoint && !p
21000 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
21010 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66  r) ){.    iHdrOf
21020 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
21030 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61  iHdrOffset ? pSa
21040 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
21050 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70  set : szJ;.    p
21060 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21070 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
21080 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69  iOffset;.    whi
21090 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
210a0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
210b0 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20  rnalOff<iHdrOff 
210c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
210d0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
210e0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
210f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21100 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
21110 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
21120 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
21130 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NE );.  }else{. 
21140 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21150 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
21160 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
21170 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
21180 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
21190 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
211a0 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
211b0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
211c0 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
211d0 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
211e0 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
211f0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
21200 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
21210 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
21220 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
21230 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
21240 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
21250 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
21260 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
21270 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
21280 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
21290 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
212a0 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
212b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
212c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
212d0 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20   u32 nJRec = 0; 
212e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
212f0 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
21300 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
21310 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
21320 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
21330 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  r, 0, szJ, &nJRe
21340 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
21350 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21360 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20  TE_DONE );..    
21370 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70  /*.    ** The "p
21380 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
21390 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
213a0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
213b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20  ->journalOff".  
213c0 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c    ** test is rel
213d0 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23  ated to ticket #
213e0 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64  2565.  See the d
213f0 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65  iscussion in the
21400 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  .    ** pager_pl
21410 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f  ayback() functio
21420 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  n for additional
21430 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
21440 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52    */.    if( nJR
21450 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  ec==0 .     && p
21460 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
21470 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
21480 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
21490 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20  ->journalOff.   
214a0 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
214b0 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70  = (u32)((szJ - p
214c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
214d0 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  f)/JOURNAL_PG_SZ
214e0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
214f0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72  .    for(ii=0; r
21500 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21510 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67  ii<nJRec && pPag
21520 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
21530 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  zJ; ii++){.     
21540 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
21550 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
21560 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
21570 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
21580 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
21590 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
215a0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
215b0 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
215c0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
215d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
215e0 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  =szJ );..  /* Fi
215f0 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b  nally,  rollback
21600 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
21610 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61  sub-journal.  Pa
21620 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a  ge that were.  *
21630 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c  * previously rol
21640 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20  led back out of 
21650 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21660 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20   (and are hence 
21670 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77  in pDone).  ** w
21680 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ill be skipped. 
21690 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   Out-of-range pa
216a0 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69  ges are also ski
216b0 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  pped..  */.  if(
216c0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
216d0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
216e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
216f0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34  unter */.    i64
21700 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70   offset = (i64)p
21710 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
21720 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
21730 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  geSize);..    if
21740 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
21750 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
21760 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61  c = sqlite3WalSa
21770 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67  vepointUndo(pPag
21780 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70  er->pWal, pSavep
21790 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b  oint->aWalData);
217a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
217b0 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
217c0 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
217d0 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
217e0 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
217f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21800 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69   offset==(i64)ii
21810 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
21820 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72  Size) );.      r
21830 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
21840 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
21850 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f  er, &offset, pDo
21860 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 0, 1);.    }
21870 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21880 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
21890 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
218a0 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
218b0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
218c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
218d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
218e0 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20  f = szJ;.  }..  
218f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21900 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
21910 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
21920 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
21930 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
21940 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
21950 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
21960 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
21970 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
21980 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
21990 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
219a0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
219b0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  age);.}../*.** I
219c0 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e  nvoke SQLITE_FCN
219d0 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73  TL_MMAP_SIZE bas
219e0 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
219f0 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61  t value of szMma
21a00 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
21a10 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d  d pagerFixMaplim
21a20 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
21a30 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
21a40 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
21a50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
21a60 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20   = pPager->fd;. 
21a70 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20   if( isOpen(fd) 
21a80 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  && fd->pMethods-
21a90 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a  >iVersion>=3 ){.
21aa0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
21ab0 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70  4 sz;.    sz = p
21ac0 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20  Pager->szMmap;. 
21ad0 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46     pPager->bUseF
21ae0 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20  etch = (sz>0);. 
21af0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
21b00 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
21b10 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
21b20 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
21b30 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  &sz);.  }.#endif
21b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
21b50 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
21b60 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20  e of any memory 
21b70 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20  mapping made of 
21b80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21b90 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
21ba0 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
21bb0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
21bc0 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
21bd0 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67   szMmap){.  pPag
21be0 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d  er->szMmap = szM
21bf0 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d  map;.  pagerFixM
21c00 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
21c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
21c20 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
21c30 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74   possible from t
21c40 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69  he pager..*/.voi
21c50 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  d sqlite3PagerSh
21c60 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67  rink(Pager *pPag
21c70 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
21c80 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65  acheShrink(pPage
21c90 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
21ca0 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74  /*.** Adjust set
21cb0 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  tings of the pag
21cc0 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  er to those spec
21cd0 69 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46  ified in the pgF
21ce0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a  lags parameter..
21cf0 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c  **.** The "level
21d00 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50  " in pgFlags & P
21d10 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
21d20 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72  _MASK sets the r
21d30 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20  obustness.** of 
21d40 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
21d50 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
21d60 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65   crashes or powe
21d70 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a  r failures by.**
21d80 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
21d90 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
21da0 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68   when writing th
21db0 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  e journals..** T
21dc0 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
21dd0 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
21de0 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
21df0 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
21e00 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
21e10 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
21e20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21e30 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
21e40 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
21e50 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
21e60 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
21e70 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
21e80 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
21e90 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
21eb0 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
21ec0 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
21ed0 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
21ee0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21ef0 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
21f00 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
21f10 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
21f20 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
21f30 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
21f40 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
21f50 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
21f60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
21f80 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
21f90 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
21fa0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
21fb0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
21fc0 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
21fd0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
21fe0 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
21ff0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
22000 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
22010 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
22020 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
22030 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
22040 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
22050 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
22060 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
22070 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22080 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
22090 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
220a0 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
220b0 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
220c0 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
220d0 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
220e0 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
22100 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
22110 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
22120 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
22130 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
22140 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
22150 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
22160 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
22170 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
22180 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
22190 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
221a0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
221b0 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
221c0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ack..**.** The a
221d0 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f  bove is for a ro
221e0 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d  llback-journal m
221f0 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f  ode.  For WAL mo
22200 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65  de, OFF continue
22210 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61  s.** to mean tha
22220 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20  t no syncs ever 
22230 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d  occur.  NORMAL m
22240 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
22250 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70  L is synced.** p
22260 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
22270 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20  t of checkpoint 
22280 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
22290 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 73 79  abase file is sy
222a0 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63  nced.** at the c
222b0 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65  onclusion of the
222c0 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74   checkpoint if t
222d0 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
222e0 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20  t of the WAL.** 
222f0 77 61 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b  was written back
22300 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
22310 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63  se.  But no sync
22320 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75   operations occu
22330 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69  r for.** an ordi
22340 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e  nary commit in N
22350 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20  ORMAL mode with 
22360 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73  WAL.  FULL means
22370 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a   that the WAL.**
22380 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
22390 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63  following each c
223a0 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c  ommit operation,
223b0 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   in addition to 
223c0 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73  the.** syncs ass
223d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52  ociated with NOR
223e0 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  MAL..**.** Do no
223f0 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72  t confuse synchr
22400 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20  onous=FULL with 
22410 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22420 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45  .  The.** SQLITE
22430 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f  _SYNC_FULL macro
22440 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68   means to use th
22450 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66  e MacOSX-style f
22460 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69  ull-fsync.** usi
22470 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46  ng fcntl(F_FULLF
22480 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53  SYNC).  SQLITE_S
22490 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  YNC_NORMAL means
224a0 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64   to do an.** ord
224b0 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63 61  inary fsync() ca
224c0 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ll.  There is no
224d0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
224e0 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  een SQLITE_SYNC_
224f0 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49  FULL.** and SQLI
22500 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
22510 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65  n platforms othe
22520 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20  r than MacOSX.  
22530 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68  But the.** synch
22540 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73  ronous=FULL vers
22550 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  us synchronous=N
22560 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65  ORMAL setting de
22570 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a  termines when.**
22580 20 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69   the xSync primi
22590 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tive is called a
225a0 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74  nd is relevant t
225b0 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e  o all platforms.
225c0 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
225d0 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
225e0 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
225f0 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
22600 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
22610 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
22620 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
22630 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
22640 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
22650 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65 72 20  tFlags(.  Pager 
22660 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
22670 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20  /* The pager to 
22680 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c  set safety level
22690 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e   for */.  unsign
226a0 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
226b0 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73  /* Various flags
226c0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
226d0 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61 67  d level = pgFlag
226e0 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
226f0 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 61 73  ONOUS_MASK;.  as
22700 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26  sert( level>=1 &
22710 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20  & level<=3 );.  
22720 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
22730 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70    (level==1 || p
22740 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
22750 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
22760 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76  >fullSync = (lev
22770 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
22780 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
22790 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
227a0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  noSync ){.    pP
227b0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
227c0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
227d0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
227e0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
227f0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22800 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20  FULLFSYNC ){.   
22810 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
22820 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22830 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65  _FULL;.    pPage
22840 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22850 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
22860 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ULL;.  }else if(
22870 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
22880 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20  _CKPT_FULLFSYNC 
22890 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
228a0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
228b0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
228c0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
228d0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
228e0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
228f0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
22900 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
22910 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22920 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22930 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
22940 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22950 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
22960 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70  walSyncFlags = p
22970 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22980 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
22990 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
229a0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
229b0 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43  lags |= WAL_SYNC
229c0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20  _TRANSACTIONS;. 
229d0 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67 73   }.  if( pgFlags
229e0 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53 50   & PAGER_CACHESP
229f0 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ILL ){.    pPage
22a00 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
22a10 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b   ~SPILLFLAG_OFF;
22a20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
22a30 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
22a40 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46   |= SPILLFLAG_OF
22a50 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  F;.  }.}.#endif.
22a60 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
22a70 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
22a80 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
22a90 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
22aa0 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
22ab0 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
22ac0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
22ad0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
22ae0 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
22af0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
22b00 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
22b10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
22b20 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
22b30 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
22b40 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
22b50 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
22b60 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72  y file..**.** Wr
22b70 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
22b80 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46  criptor into *pF
22b90 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ile. Return SQLI
22ba0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
22bb0 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68   .** or some oth
22bc0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
22bd0 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
22be0 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
22bf0 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  lly .** delete t
22c00 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
22c10 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
22c20 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  sed..**.** The f
22c30 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74  lags passed to t
22c40 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70  he VFS layer xOp
22c50 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68  en() call are th
22c60 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ose specified.**
22c70 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66   by parameter vf
22c80 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68  sFlags ORed with
22c90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
22ca0 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
22cb0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
22cc0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
22cd0 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20  EN_CREATE.**    
22ce0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
22cf0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51  LUSIVE.**     SQ
22d00 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
22d10 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69  ONCLOSE.*/.stati
22d20 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74  c int pagerOpent
22d30 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
22d40 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
22d50 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
22d60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
22d70 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
22d80 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
22d90 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
22da0 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
22db0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
22dc0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
22dd0 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
22de0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
22df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22e00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  urn code */..#if
22e10 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
22e20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
22e30 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
22e40 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
22e50 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
22e60 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
22e70 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
22e80 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22e90 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
22ea0 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
22eb0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
22ec0 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
22ed0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
22ee0 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
22ef0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
22f00 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
22f10 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
22f20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
22f30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
22f40 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a  sOpen(pFile) );.
22f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22f60 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
22f70 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
22f80 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ion..**.** The p
22f90 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65  ager invokes the
22fa0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66   busy-handler if
22fb0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
22fc0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
22fd0 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72  ITE_BUSY when tr
22fe0 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
22ff0 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20  from no-lock to 
23000 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a  a SHARED lock,.*
23010 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67  * or when trying
23020 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
23030 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
23040 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
23050 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f   .** lock. It do
23060 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20  es *not* invoke 
23070 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
23080 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
23090 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74  from.** SHARED t
230a0 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77  o RESERVED, or w
230b0 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
230c0 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43  om SHARED to EXC
230d0 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68  LUSIVE.** (which
230e0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68   occurs during h
230f0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
23100 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a  ack). Summary:.*
23110 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f  *.**   Transitio
23120 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
23130 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b           | Invok
23140 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a  es xBusyHandler.
23150 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
23160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
23190 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20     NO_LOCK      
231a0 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   -> SHARED_LOCK 
231b0 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20       | Yes.**   
231c0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
231d0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20   RESERVED_LOCK  
231e0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52    | No.**   SHAR
231f0 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43  ED_LOCK   -> EXC
23200 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
23210 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44  No.**   RESERVED
23220 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49  _LOCK -> EXCLUSI
23230 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a  VE_LOCK   | Yes.
23240 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73  **.** If the bus
23250 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
23260 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ck returns non-z
23270 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
23280 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66   .** retried. If
23290 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
232a0 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54  , then the SQLIT
232b0 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a  E_BUSY error is.
232c0 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ** returned to t
232d0 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65  he caller of the
232e0 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
232f0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
23300 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
23310 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72  handler(.  Pager
23320 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
23350 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
23360 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29  Handler)(void *)
23370 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ,         /* Poi
23380 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e  nter to busy-han
23390 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  dler function */
233a0 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
233b0 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20  ndlerArg        
233c0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
233d0 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ent to pass to x
233e0 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29  BusyHandler */.)
233f0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73  {.  pPager->xBus
23400 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79  yHandler = xBusy
23410 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65  Handler;.  pPage
23420 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
23430 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  rg = pBusyHandle
23440 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f  rArg;..  if( isO
23450 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
23460 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70  ){.    void **ap
23470 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61   = (void **)&pPa
23480 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
23490 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  r;.    assert( (
234a0 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29  (int(*)(void *))
234b0 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48  (ap[0]))==xBusyH
234c0 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73  andler );.    as
234d0 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75  sert( ap[1]==pBu
234e0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a  syHandlerArg );.
234f0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
23500 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
23510 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
23520 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45  FCNTL_BUSYHANDLE
23530 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a  R, (void *)ap);.
23540 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
23550 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
23560 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
23570 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
23580 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
23590 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
235a0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
235b0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
235c0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
235d0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
235e0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
235f0 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
23600 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
23610 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
23620 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
23630 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
23640 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
23650 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  RR, an SQLITE_IO
23660 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65  ERR_xxx sub-code
23670 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29   or SQLITE_FULL)
23680 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
23690 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  e, if all of the
236a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
236b0 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74  rue:.**.**   * t
236c0 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
236d0 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67   (value of *pPag
236e0 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20  eSize) is valid 
236f0 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20  (a power .**    
23700 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20   of two between 
23710 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d  512 and SQLITE_M
23720 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e  AX_PAGE_SIZE, in
23730 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a  clusive), and.**
23740 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72  .**   * there ar
23750 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
23760 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
23770 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
23780 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
23790 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e  either not an in
237a0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
237b0 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20   or it is.**    
237c0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
237d0 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72  tabase that curr
237e0 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f  ently consists o
237f0 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a  f zero pages..**
23800 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67  .** then the pag
23810 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73  er object page s
23820 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70  ize is set to *p
23830 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
23840 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
23850 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
23860 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
23870 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65  uses sqlite3Page
23880 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f  rMalloc() .** to
23890 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61   obtain a new Pa
238a0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
238b0 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c  ffer. If this al
238c0 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
238d0 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49   .** fails, SQLI
238e0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
238f0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
23900 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75  e size remains u
23910 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e  nchanged. .** In
23920 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
23930 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
23940 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
23950 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
23960 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20  is not changed, 
23970 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f  either because o
23980 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72  ne of the enumer
23990 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ated.** conditio
239a0 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ns above is not 
239b0 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20  true, the pager 
239c0 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61  was in error sta
239d0 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
239e0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
239f0 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20  led, or because 
23a00 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
23a10 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61  ation attempt fa
23a20 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a  iled, .** then *
23a30 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74  pPageSize is set
23a40 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74   to the old, ret
23a50 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20  ained page size 
23a60 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
23a70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23a80 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
23a90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
23aa0 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20  u32 *pPageSize, 
23ab0 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20  int nReserve){. 
23ac0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23ad0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  _OK;..  /* It is
23ae0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
23af0 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72   do a full asser
23b00 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
23b10 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20  here, as this.  
23b20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  ** function may 
23b30 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
23b40 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28  ithin PagerOpen(
23b50 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74  ), before the st
23b60 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ate.  ** of the 
23b70 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  Pager object is 
23b80 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69  internally consi
23b90 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stent..  **.  **
23ba0 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
23bb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
23bc0 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  rned an error if
23bd0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
23be0 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52  n .  ** PAGER_ER
23bf0 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73  ROR state. But s
23c00 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52  ince PAGER_ERROR
23c10 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65   state guarantee
23c20 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72  s that.  ** ther
23c30 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  e is at least on
23c40 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  e outstanding pa
23c50 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68  ge reference, th
23c60 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
23c70 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
23c80 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77  that case anyhow
23c90 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61  ..  */..  u32 pa
23ca0 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
23cb0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
23cc0 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
23cd0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
23ce0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
23cf0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
23d00 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
23d10 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
23d20 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
23d30 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63  .   && sqlite3Pc
23d40 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
23d50 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
23d60 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65   .   && pageSize
23d70 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75   && pageSize!=(u
23d80 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
23d90 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ize .  ){.    ch
23da0 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b  ar *pNew = NULL;
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23dc0 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a  New temp space *
23dd0 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20  /.    i64 nByte 
23de0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50  = 0;..    if( pP
23df0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
23e00 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65  ER_OPEN && isOpe
23e10 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
23e20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23e30 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
23e40 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65  ager->fd, &nByte
23e50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
23e60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23e70 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28  {.      pNew = (
23e80 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
23e90 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
23ea0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
23eb0 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54  New ) rc = SQLIT
23ec0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a  E_NOMEM;.    }..
23ed0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23ee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
23ef0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
23f00 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
23f10 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50  qlite3PcacheSetP
23f20 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ageSize(pPager->
23f30 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a  pPCache, pageSiz
23f40 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
23f50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23f60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23f70 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
23f80 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
23f90 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
23fa0 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
23fb0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
23fc0 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74  e = (Pgno)((nByt
23fd0 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61  e+pageSize-1)/pa
23fe0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
23ff0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
24000 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
24010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
24020 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e 65  ite3PageFree(pNe
24030 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  w);.    }.  }.. 
24040 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50   *pPageSize = pP
24050 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
24060 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24070 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
24080 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73  Reserve<0 ) nRes
24090 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e  erve = pPager->n
240a0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
240b0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
240c0 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30   && nReserve<100
240d0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
240e0 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36  >nReserve = (i16
240f0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  )nReserve;.    p
24100 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
24110 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
24120 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
24130 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
24140 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24150 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
24160 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
24170 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
24180 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
24190 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
241a0 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
241b0 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
241c0 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
241d0 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
241e0 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
241f0 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
24200 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
24210 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
24220 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
24230 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
24240 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
24250 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
24260 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
24270 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
24280 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
24290 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
242a0 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
242b0 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
242c0 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
242d0 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
242e0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
242f0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
24300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
24310 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
24320 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
24330 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
24340 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
24350 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
24360 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
24370 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
24380 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
24390 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
243a0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
243b0 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
243c0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
243d0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
243e0 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
243f0 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
24400 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
24410 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
24420 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
24430 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
24440 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
24450 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
24460 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
24470 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
24480 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Page;.  }.  asse
24490 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
244a0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
244b0 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64  ;      /* Called
244c0 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50   only by OP_MaxP
244d0 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74  gcnt */.  assert
244e0 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
244f0 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  >=pPager->dbSize
24500 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67   );  /* OP_MaxPg
24510 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69  cnt enforces thi
24520 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50  s */.  return pP
24530 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
24540 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
24550 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
24560 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
24570 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
24580 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
24590 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
245a0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
245b0 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
245c0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
245d0 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
245e0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
245f0 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
24600 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
24610 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
24620 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
24630 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
24640 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
24650 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
24660 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
24670 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
24680 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24690 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
246a0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
246b0 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
246c0 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
246d0 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
246e0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
246f0 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
24700 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
24710 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
24720 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
24730 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
24740 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
24750 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
24760 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
24770 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
24780 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
24790 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
247a0 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
247b0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
247c0 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
247d0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
247e0 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
247f0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
24800 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
24810 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
24820 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
24830 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
24840 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
24850 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
24860 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ager was opened 
24870 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  on a transient f
24880 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ile (zFilename==
24890 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65  ""), or.** opene
248a0 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73  d on a file less
248b0 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e   than N bytes in
248c0 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75   size, the outpu
248d0 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a  t buffer is.** z
248e0 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45  eroed and SQLITE
248f0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
24900 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20  e rationale for 
24910 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
24920 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
24930 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
24940 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c  atabase headers,
24950 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73   and a new trans
24960 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20  ient or.** zero 
24970 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68  sized database h
24980 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e  as a header than
24990 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
249a0 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a  ly of zeroes..**
249b0 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72  .** If any IO er
249c0 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53  ror apart from S
249d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
249e0 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e  T_READ is encoun
249f0 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  tered,.** the er
24a00 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
24a10 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
24a20 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  er and the conte
24a30 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  nts of the.** ou
24a40 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65  tput buffer unde
24a50 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fined..*/.int sq
24a60 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
24a70 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
24a80 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
24a90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
24aa0 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
24ab0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
24ac0 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
24ad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
24ae0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
24af0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
24b00 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ile );..  /* Thi
24b10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
24b20 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65  y called by btre
24b30 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  e immediately af
24b40 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  ter creating.  *
24b50 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  * the Pager obje
24b60 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e  ct.  There has n
24b70 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72  ot been an oppor
24b80 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69  tunity to transi
24b90 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c  tion.  ** to WAL
24ba0 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a   mode yet..  */.
24bb0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
24bc0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
24bd0 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  ;..  if( isOpen(
24be0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
24bf0 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
24c00 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
24c10 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
24c20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
24c30 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
24c40 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20  est, N, 0);.    
24c50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
24c60 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
24c70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
24c80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
24c90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24cb0 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
24cc0 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
24cd0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
24ce0 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20  n is open on.** 
24cf0 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72 65  the pager. It re
24d00 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
24d10 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
24d20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
24d30 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  .**.** However, 
24d40 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62  if the file is b
24d50 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61  etween 1 and <pa
24d60 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69  ge-size> bytes i
24d70 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a  n size, then .**
24d80 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65   this is conside
24d90 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c  red a 1 page fil
24da0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
24db0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
24dc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24dd0 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
24de0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24df0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
24e00 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
24e10 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24e20 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  !=PAGER_WRITER_F
24e30 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e  INISHED );.  *pn
24e40 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67  Page = (int)pPag
24e50 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a  er->dbSize;.}...
24e60 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
24e70 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
24e80 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74  pe locktype on t
24e90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24ea0 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61  . If.** a simila
24eb0 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  r or greater loc
24ec0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
24ed0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
24ee0 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28   is a no-op.** (
24ef0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
24f00 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29  _OK immediately)
24f10 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
24f20 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  e, attempt to ob
24f30 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73  tain the lock us
24f40 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  ing sqlite3OsLoc
24f50 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20  k(). Invoke .** 
24f60 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
24f70 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  k if the lock is
24f80 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
24f90 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74  vailable. Repeat
24fa0 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62   .** until the b
24fb0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
24fc0 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e  urns false or un
24fd0 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20  til the attempt 
24fe0 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68  to .** obtain th
24ff0 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
25000 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
25010 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
25020 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
25030 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
25040 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
25050 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
25060 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75  k is obtained su
25070 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20  ccessfully, set 
25080 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20  the Pager.state 
25090 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20  .** variable to 
250a0 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20  locktype before 
250b0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
250c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
250d0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
250e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
250f0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
25100 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25120 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
25130 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
25140 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68  hat this is eith
25150 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61  er a no-op (beca
25160 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65  use the requeste
25170 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20  d lock is .  ** 
25180 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f  already held), o
25190 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
251a0 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68  nsitions that th
251b0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20  e busy-handler. 
251c0 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b   ** may be invok
251d0 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72  ed during, accor
251e0 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d  ding to the comm
251f0 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73  ent above.  ** s
25200 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
25210 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a  syhandler()..  *
25220 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  /.  assert( (pPa
25230 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b  ger->eLock>=lock
25240 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  type).       || 
25250 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
25260 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  NO_LOCK && lockt
25270 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
25280 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
25290 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45  ger->eLock==RESE
252a0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63  RVED_LOCK && loc
252b0 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
252c0 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64  _LOCK).  );..  d
252d0 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  o {.    rc = pag
252e0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
252f0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77   locktype);.  }w
25300 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
25310 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d  _BUSY && pPager-
25320 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  >xBusyHandler(pP
25330 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
25340 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75  erArg) );.  retu
25350 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25360 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
25370 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25380 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
25390 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
253a0 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
253b0 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
253c0 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
253d0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
253e0 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
253f0 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
25400 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
25410 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
25420 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
25430 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
25440 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
25450 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
25460 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
25470 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
25480 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
25490 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
254a0 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
254b0 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
254c0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
254d0 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
254e0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
254f0 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
25500 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
25510 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
25520 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
25530 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
25540 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
25550 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
25560 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
25570 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
25580 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
25590 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
255a0 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
255b0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
255c0 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
255d0 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
255e0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
255f0 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
25600 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
25610 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
25620 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
25630 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
25640 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
25650 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
25660 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20  havior would be 
25670 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
25680 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
25690 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
256a0 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
256b0 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
256c0 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
256d0 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
256e0 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
256f0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
25700 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
25710 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
25720 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
25730 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
25740 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
25750 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
25760 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
25770 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
25780 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
25790 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
257a0 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
257b0 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
257c0 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
257d0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
257e0 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
257f0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25800 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
25810 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
25820 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
25830 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
25840 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
25850 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
25860 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
25870 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
25880 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
25890 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
258a0 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
258b0 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
258c0 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
258d0 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
258e0 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
258f0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
25900 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
25910 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
25920 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
25930 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
25940 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
25950 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
25960 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
25970 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
25980 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
25990 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
259a0 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
259b0 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
259c0 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
259d0 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
259e0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
259f0 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
25a00 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
25a10 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
25a20 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
25a30 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
25a40 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
25a50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25a60 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
25a70 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
25a80 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
25a90 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74  ction..** Once t
25aa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
25ab0 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
25ac0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e transaction mu
25ad0 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20  st either be.** 
25ae0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63  rolled back or c
25af0 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20  ommitted. It is 
25b00 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c  not safe to call
25b10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
25b20 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69  nd.** then conti
25b30 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  nue writing to t
25b40 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
25b50 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
25b60 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
25b70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
25b80 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
25b90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
25ba0 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
25bb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25bc0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
25bd0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
25be0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
25bf0 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a  e = nPage;..  /*
25c00 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
25c10 65 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c  e code here call
25c20 65 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ed assertTruncat
25c30 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f  eConstraint() to
25c40 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61  .  ** ensure tha
25c50 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e  t all pages bein
25c60 67 20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79  g truncated away
25c70 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
25c80 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20  on are,.  ** if 
25c90 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
25ca0 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c  points are open,
25cb0 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
25cc0 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
25cd0 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
25ce0 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74  they can be rest
25cf0 6f 72 65 64 20 69 66 20 74 68 65 20 73 61 76 65  ored if the save
25d00 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a  point is rolled.
25d10 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20    ** back. This 
25d20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63  is no longer nec
25d30 65 73 73 61 72 79 20 61 73 20 74 68 69 73 20 66  essary as this f
25d40 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f  unction is now o
25d50 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20  nly.  ** called 
25d60 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
25d70 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
25d80 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75  ction. So althou
25d90 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  gh the .  ** Pag
25da0 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74  er object may st
25db0 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61  ill have open sa
25dc0 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e  vepoints (Pager.
25dd0 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20  nSavepoint!=0), 
25de0 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f  .  ** they canno
25df0 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
25e00 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72 74 54  . So the assertT
25e10 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25e20 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73  t() call.  ** is
25e30 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65   no longer corre
25e40 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ct. */.}.../*.**
25e50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25e60 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
25e70 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
25e80 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
25e90 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
25ea0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25eb0 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
25ec0 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
25ed0 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
25ee0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
25ef0 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
25f00 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
25f10 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
25f20 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
25f30 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
25f40 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
25f50 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
25f60 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
25f70 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
25f80 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
25f90 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
25fa0 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
25fb0 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
25fc0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
25fd0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
25fe0 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
25ff0 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
26000 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
26010 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
26020 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
26030 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
26040 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
26050 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
26060 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
26070 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
26080 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
26090 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
260a0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
260b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
260c0 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
260d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
260e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
260f0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
26100 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
26110 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26120 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
26130 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
26140 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
26150 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26160 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
26170 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
26180 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
26190 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
261a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
261b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  ;.}../*.** Obtai
261c0 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
261d0 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64   a memory mapped
261e0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72   page object for
261f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
26200 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f  o. .** The new o
26210 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74  bject will use t
26220 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61  he pointer pData
26230 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  , obtained from 
26240 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20  xFetch()..** If 
26250 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
26260 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74  *ppPage to point
26270 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
26280 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e   reference.** an
26290 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
262a0 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  OK. Otherwise, r
262b0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
262c0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73  error code and s
262d0 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f  et.** *ppPage to
262e0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67   zero..**.** Pag
262f0 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74  e references obt
26300 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ained by calling
26310 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
26320 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65  hould be release
26330 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20  d.** by calling 
26340 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
26350 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
26360 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72   int pagerAcquir
26370 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67 65  eMapPage(.  Page
26380 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
26390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
263a0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
263b0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
263c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263d0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
263e0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  */.  void *pData
263f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26400 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29       /* xFetch()
26410 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  'd data for this
26420 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
26430 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20 20   **ppPage       
26440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
26450 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67 65  T: Acquired page
26460 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
26470 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26490 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64  /* Memory mapped
264a0 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20   page to return 
264b0 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67  */.  .  if( pPag
264c0 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
264d0 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  t ){.    *ppPage
264e0 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70   = p = pPager->p
264f0 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
26500 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46    pPager->pMmapF
26510 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69  reelist = p->pDi
26520 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
26530 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73  ty = 0;.    mems
26540 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c  et(p->pExtra, 0,
26550 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
26560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
26570 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67  ppPage = p = (Pg
26580 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  Hdr *)sqlite3Mal
26590 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
265a0 67 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e  gHdr) + pPager->
265b0 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28  nExtra);.    if(
265c0 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p==0 ){.      s
265d0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
265e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
265f0 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67  )(pgno-1) * pPag
26600 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44  er->pageSize, pD
26610 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
26620 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
26630 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45  .    }.    p->pE
26640 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26  xtra = (void *)&
26650 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  p[1];.    p->fla
26660 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b  gs = PGHDR_MMAP;
26670 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
26680 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20  ;.    p->pPager 
26690 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20  = pPager;.  }.. 
266a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74   assert( p->pExt
266b0 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31  ra==(void *)&p[1
266c0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
266d0 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ->pPage==0 );.  
266e0 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73  assert( p->flags
266f0 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a  ==PGHDR_MMAP );.
26700 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
26710 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
26720 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
26730 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e  ==1 );..  p->pgn
26740 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70  o = pgno;.  p->p
26750 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
26760 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
26770 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ++;..  return SQ
26780 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
26790 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
267a0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50  rence to page pP
267b0 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65  g. pPg must have
267c0 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62   been returned b
267d0 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72  y an .** earlier
267e0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63   call to pagerAc
267f0 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a  quireMapPage()..
26800 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
26810 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
26820 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
26830 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
26840 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
26850 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
26860 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72  t--;.  pPg->pDir
26870 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d  ty = pPager->pMm
26880 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50  apFreelist;.  pP
26890 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
268a0 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73  ist = pPg;..  as
268b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64  sert( pPager->fd
268c0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
268d0 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c  sion>=3 );.  sql
268e0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
268f0 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
26900 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61  pPg->pgno-1)*pPa
26910 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
26920 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f  Pg->pData);.}../
26930 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67  *.** Free all Pg
26940 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72  Hdr objects stor
26950 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ed in the Pager.
26960 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69  pMmapFreelist li
26970 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
26980 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  id pagerFreeMapH
26990 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  drs(Pager *pPage
269a0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  r){.  PgHdr *p;.
269b0 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a    PgHdr *pNext;.
269c0 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
269d0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70  pMmapFreelist; p
269e0 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
269f0 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74  pNext = p->pDirt
26a00 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  y;.    sqlite3_f
26a10 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ree(p);.  }.}...
26a20 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
26a30 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
26a40 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
26a50 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
26a60 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
26a70 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
26a80 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
26a90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
26aa0 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
26ab0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
26ac0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
26ad0 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
26ae0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
26af0 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
26b00 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
26b10 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
26b20 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
26b30 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
26b40 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
26b50 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
26b60 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
26b70 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
26b80 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
26b90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
26ba0 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
26bb0 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
26bc0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
26bd0 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
26be0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
26bf0 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
26c00 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
26c10 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
26c20 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
26c30 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
26c40 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
26c50 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
26c60 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
26c70 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
26c80 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
26c90 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
26ca0 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
26cb0 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
26cc0 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65  mpSpace;..  asse
26cd0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
26ce0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
26cf0 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ;.  disable_simu
26d00 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
26d10 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
26d20 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
26d30 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  .  pagerFreeMapH
26d40 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  drs(pPager);.  /
26d50 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  * pPager->errCod
26d60 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
26d70 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
26d80 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
26d90 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
26da0 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65   sqlite3WalClose
26db0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
26dc0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
26dd0 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61  lags, pPager->pa
26de0 67 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20  geSize, pTmp);. 
26df0 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20   pPager->pWal = 
26e00 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65  0;.#endif.  page
26e10 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
26e20 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
26e30 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
26e40 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
26e50 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20  e{.    /* If it 
26e60 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68  is open, sync th
26e70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
26e80 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e  efore calling Un
26e90 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e  lockAndRollback.
26ea0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
26eb0 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65  is not done, the
26ec0 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f  n an unsynced po
26ed0 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65  rtion of the ope
26ee0 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  n journal .    *
26ef0 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c  * file may be pl
26f00 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
26f10 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
26f20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
26f30 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77  occurs .    ** w
26f40 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70  hile this is hap
26f50 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
26f60 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d  base could becom
26f70 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
26f80 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65  *.    ** If an e
26f90 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
26fa0 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63  e trying to sync
26fb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68   the journal, sh
26fc0 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ift the pager.  
26fd0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52    ** into the ER
26fe0 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20  ROR state. This 
26ff0 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64  causes UnlockAnd
27000 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f  Rollback to unlo
27010 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  ck the.    ** da
27020 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65  tabase and close
27030 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27040 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70  e without attemp
27050 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a  ting to roll it.
27060 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66      ** back or f
27070 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20  inalize it. The 
27080 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73  next database us
27090 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  er will have to 
270a0 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20  do hot-journal. 
270b0 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62     ** rollback b
270c0 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20  efore accessing 
270d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
270e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
270f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27100 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70  >jfd) ){.      p
27110 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
27120 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  r, pagerSyncHotJ
27130 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b  ournal(pPager));
27140 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
27150 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
27160 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
27170 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
27180 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
27190 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
271a0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
271b0 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
271c0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
271d0 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
271e0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
271f0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
27200 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
27210 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c  ger->jfd);.  sql
27220 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
27230 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
27240 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
27250 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
27260 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
27270 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
27280 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
27290 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
272a0 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
272b0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
272c0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
272d0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
272e0 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
272f0 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
27300 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
27310 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
27320 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27330 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
27340 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
27350 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
27360 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
27370 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
27380 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
27390 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
273a0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
273b0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
273c0 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
273d0 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
273e0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
273f0 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
27400 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
27410 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
27420 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
27430 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
27440 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
27450 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
27460 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
27470 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
27480 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
27490 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
274a0 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
274b0 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
274c0 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
274d0 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
274e0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
274f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
27500 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
27510 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
27520 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
27530 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
27540 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
27550 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
27560 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
27570 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  f the Pager.noSy
27580 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nc flag is set, 
27590 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
275a0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
275b0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
275c0 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
275d0 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
275e0 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64  journal-mode and
275f0 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20   the .** device 
27600 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
27610 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  of the file-syst
27620 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
27630 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
27640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27650 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
27660 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
27670 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
27680 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
27690 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
276a0 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
276b0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
276c0 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
276d0 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
276e0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
276f0 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
27700 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
27710 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
27720 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
27730 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
27740 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
27750 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
27760 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
27770 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
27780 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
27790 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
277a0 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
277b0 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
277c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
277d0 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
277e0 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
277f0 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
27800 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
27810 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
27820 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
27830 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
27840 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
27850 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
27860 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
27870 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
27880 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
27890 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
278a0 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
278b0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
278c0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
278d0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
278e0 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
278f0 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
27900 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
27910 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
27920 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
27930 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
27940 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
27950 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66  .**   }.**.** If
27960 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
27970 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
27980 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
27990 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
279a0 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
279b0 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
279c0 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
279d0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
279e0 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
279f0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
27a00 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
27a10 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
27a20 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
27a30 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
27a40 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
27a50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
27a60 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74  t newHdr){.  int
27a70 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27a90 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
27aa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27ab0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
27ac0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
27ad0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
27ae0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
27af0 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
27b00 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
27b10 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
27b20 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
27b30 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
27b40 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
27b50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27b60 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
27b70 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  ager, 0);.  if( 
27b80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
27b90 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
27ba0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
27bb0 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
27bc0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
27bd0 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  le );.    if( is
27be0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27bf0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
27c00 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
27c10 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
27c20 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  RY ){.      cons
27c30 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69  t int iDc = sqli
27c40 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
27c50 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
27c60 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
27c70 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
27c80 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
27c90 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
27ca0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
27cb0 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
27cc0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
27cd0 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e  ck deals with an
27ce0 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d   obscure problem
27cf0 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f  . If the last co
27d00 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nnection.       
27d10 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74   ** that wrote t
27d20 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
27d30 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  was operating in
27d40 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72   persistent-jour
27d50 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  nal.        ** m
27d60 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
27d70 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61  urnal file may a
27d80 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74  t this point act
27d90 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a  ually be larger.
27da0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20          ** than 
27db0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
27dc0 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e   bytes. If the n
27dd0 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65  ext thing in the
27de0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
27df0 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73   ** file happens
27e00 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c   to be a journal
27e10 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e  -header (written
27e20 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
27e30 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
27e40 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73  ous connection's
27e50 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61   transaction), a
27e60 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f  nd a crash or po
27e70 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20  wer-failure .   
27e80 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61       ** occurs a
27e90 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64  fter nRec is upd
27ea0 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20  ated but before 
27eb0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
27ec0 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20  writes .        
27ed0 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ** anything else
27ee0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
27ef0 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73  file (or commits
27f00 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20  /rolls back its 
27f10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
27f20 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53  saction), then S
27f30 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65  QLite may become
27f40 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64   confused when d
27f50 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  oing the .      
27f60 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
27f70 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
27f80 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74  ing recovery. It
27f90 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61   may roll back a
27fa0 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ll.        ** of
27fb0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
27fc0 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f  s data, then pro
27fd0 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20  ceed to rolling 
27fe0 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20  back the old,.  
27ff0 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d        ** out-of-
28000 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66  date data that f
28010 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62  ollows it. Datab
28020 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
28030 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28040 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72     ** To work ar
28050 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68  ound this, if th
28060 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
28070 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f  oes appear to co
28080 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ntain.        **
28090 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20   a valid header 
280a0 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e  following Pager.
280b0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e  journalOff, then
280c0 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20   write a 0x00.  
280d0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f        ** byte to
280e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
280f0 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66   to prevent it f
28100 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e  rom being recogn
28110 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ized..        **
28120 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69  .        ** Vari
28130 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66  able iNextHdrOff
28140 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
28150 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63  e offset at whic
28160 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  h this.        *
28170 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65  * problematic he
28180 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c  ader will occur,
28190 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61   if it exists. a
281a0 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20  Magic is used . 
281b0 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74         ** as a t
281c0 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
281d0 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66  to inspect the f
281e0 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62  irst couple of b
281f0 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20  ytes of.        
28200 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c  ** the potential
28210 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
28220 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
28230 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72      i64 iNextHdr
28240 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
28250 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20  u8 aMagic[8];.  
28260 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72        u8 zHeader
28270 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
28280 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20  Magic)+4];..    
28290 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64      memcpy(zHead
282a0 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
282b0 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
282c0 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
282d0 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
282e0 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
282f0 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50  urnalMagic)], pP
28300 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
28310 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66        iNextHdrOf
28320 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  fset = journalHd
28330 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
28340 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
28350 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
28360 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
28370 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   8, iNextHdrOffs
28380 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  et);.        if(
28390 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
283a0 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67  & 0==memcmp(aMag
283b0 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
283c0 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 8) ){.       
283d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
283e0 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b  u8 zerobyte = 0;
283f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28400 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
28410 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72  Pager->jfd, &zer
28420 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48  obyte, 1, iNextH
28430 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
28440 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
28450 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
28460 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
28470 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
28480 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
28490 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
284a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
284b0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
284c0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
284d0 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
284e0 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
284f0 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
28500 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
28510 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
28520 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
28530 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
28540 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
28550 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
28560 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
28570 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
28580 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
28590 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
285a0 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
285b0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
285c0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
285d0 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
285e0 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
285f0 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
28600 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
28610 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
28620 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
28630 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
28640 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
28650 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
28660 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
28670 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
28680 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
28690 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
286a0 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
286b0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
286c0 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
286d0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
286e0 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
286f0 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
28700 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28710 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
28720 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
28730 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
28740 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
28750 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
28760 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
28770 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
28780 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
28790 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
287a0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
287b0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
287c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
287d0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
287e0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
287f0 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
28800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28810 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28830 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
28840 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
28850 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
28860 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20  alHdr));.       
28870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
28880 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
28890 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a    pPager->jfd, z
288a0 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
288b0 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d  Header), pPager-
288c0 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20  >journalHdr.    
288d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
288e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
288f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28900 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28910 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
28920 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
28930 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45   ){.        PAGE
28940 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
28950 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
28960 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
28970 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
28980 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
28990 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
289a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
289b0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
289c0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
289d0 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
289e0 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c   (pPager->syncFl
289f0 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  ags==SQLITE_SYNC
28a00 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e  _FULL?SQLITE_SYN
28a10 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20  C_DATAONLY:0).  
28a20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
28a30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28a40 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
28a50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
28a60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
28a70 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
28a80 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66  nalOff;.      if
28a90 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28  ( newHdr && 0==(
28aa0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
28ab0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
28ac0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
28ad0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
28ae0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
28af0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
28b00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28b20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
28b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28b40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28b50 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
28b60 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
28b70 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73    }..  /* Unless
28b80 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
28b90 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68   noSync mode, th
28ba0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
28bb0 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75  as just .  ** su
28bc0 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
28bd0 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  d. Either way, c
28be0 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
28bf0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e  EED_SYNC flag on
28c00 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73   .  ** all pages
28c10 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
28c20 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
28c30 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
28c40 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  ache);.  pPager-
28c50 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
28c60 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20  WRITER_DBMOD;.  
28c70 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
28c80 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
28c90 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  r) );.  return S
28ca0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28cb0 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
28cc0 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
28cd0 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
28ce0 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e   dirty pages con
28cf0 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  nected.** by the
28d00 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
28d10 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  inter. This func
28d20 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68  tion writes each
28d30 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69   one of the.** i
28d40 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69  n-memory pages i
28d50 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68  n the list to th
28d60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
28d70 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61   The argument ma
28d80 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65  y.** be NULL, re
28d90 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d  presenting an em
28da0 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69  pty list. In thi
28db0 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
28dc0 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tion is.** a no-
28dd0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  op..**.** The pa
28de0 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74  ger must hold at
28df0 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
28e00 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73  D lock when this
28e10 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
28e20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77  called. Before w
28e30 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20  riting anything 
28e40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
28e50 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a  file, this lock.
28e60 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74  ** is upgraded t
28e70 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
28e80 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
28e90 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
28ea0 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned,.** SQLITE_B
28eb0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
28ec0 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77  and no data is w
28ed0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
28ee0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
28ef0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
28f00 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
28f10 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63  pager and the ac
28f20 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d  tual file-system
28f30 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   file.** is not 
28f40 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20  yet open, it is 
28f50 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  created and open
28f60 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
28f70 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  ta is .** writte
28f80 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  n out..**.** Onc
28f90 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
28fa0 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64  een upgraded and
28fb0 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20  , if necessary, 
28fc0 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  the file opened,
28fd0 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72  .** the pages ar
28fe0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
28ff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29000 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72  le in list order
29010 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70  . Writing.** a p
29020 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69  age is skipped i
29030 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65  f it meets eithe
29040 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r of the followi
29050 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a  ng criteria:.**.
29060 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20  **   * The page 
29070 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65  number is greate
29080 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  r than Pager.dbS
29090 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54  ize, or.**   * T
290a0 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
290b0 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  ITE flag is set 
290c0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
290d0 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75  ** If writing ou
290e0 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20  t a page causes 
290f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29100 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72  e to grow, Pager
29110 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69  .dbFileSize.** i
29120 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
29130 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31  ingly. If page 1
29140 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c   is written out,
29150 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
29160 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67  cached.** in Pag
29170 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
29180 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
29190 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75  tch the new valu
291a0 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74  e stored in.** t
291b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
291c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
291d0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
291e0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
291f0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
29200 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
29210 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
29220 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
29230 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ned. Or, if the 
29240 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63  EXCLUSIVE lock c
29250 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61  annot.** be obta
29260 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53  ined, SQLITE_BUS
29270 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
29280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
29290 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
292a0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
292b0 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a   PgHdr *pList){.
292c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
292d0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
292e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
292f0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
29300 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
29310 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
29320 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20  rollback pagers 
29330 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
29340 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65  state. */.  asse
29350 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
29360 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
29370 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
29380 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
29390 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73  ER_DBMOD );.  as
293a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
293b0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
293c0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
293d0 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
293e0 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
293f0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
29400 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
29410 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
29420 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
29430 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
29440 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
29450 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
29460 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
29470 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
29480 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
29490 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
294a0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
294b0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
294c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
294d0 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
294e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
294f0 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
29500 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
29510 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
29520 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
29530 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66   /* Before the f
29540 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65  irst write, give
29550 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20   the VFS a hint 
29560 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  of what the fina
29570 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65  l.  ** file size
29580 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20   will be..  */. 
29590 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
295a0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
295b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
295c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
295d0 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65  _OK .   && pPage
295e0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50  r->dbHintSize<pP
295f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20  ager->dbSize.   
29600 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74  && (pList->pDirt
29610 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  y || pList->pgno
29620 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  >pPager->dbHintS
29630 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ize).  ){.    sq
29640 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69  lite3_int64 szFi
29650 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  le = pPager->pag
29660 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33  eSize * (sqlite3
29670 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64  _int64)pPager->d
29680 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74  bSize;.    sqlit
29690 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
296a0 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
296b0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
296c0 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29  E_HINT, &szFile)
296d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
296e0 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
296f0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a  r->dbSize;.  }..
29700 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
29710 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
29720 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
29730 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a   = pList->pgno;.
29740 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
29750 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
29760 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
29770 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
29780 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
29790 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
297a0 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
297b0 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
297c0 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61  uncateImage() wa
297d0 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
297e0 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
297f0 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
29800 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
29810 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
29820 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
29830 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
29840 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
29850 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64  *.    ** Also, d
29860 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20  o not write out 
29870 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61  any page that ha
29880 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  s the PGHDR_DONT
29890 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20  _WRITE flag.    
298a0 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73  ** set (set by s
298b0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
298c0 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a  rite())..    */.
298d0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
298e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
298f0 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
29900 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
29910 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
29920 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
29930 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
29940 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66  ageSize;   /* Of
29950 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
29960 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
29970 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29990 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f        /* Data to
299a0 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20   write */    .. 
299b0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
299c0 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
299d0 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
299e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
299f0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67  t->pgno==1 ) pag
29a00 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
29a10 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a  ounter(pList);..
29a20 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20        /* Encode 
29a30 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
29a40 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
29a50 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74  ger, pList->pDat
29a60 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75  a, pgno, 6, retu
29a70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
29a80 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20   pData);..      
29a90 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65  /* Write out the
29aa0 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20   page data. */. 
29ab0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29ac0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
29ad0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
29ae0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
29af0 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  fset);..      /*
29b00 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a   If page 1 was j
29b10 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64  ust written, upd
29b20 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ate Pager.dbFile
29b30 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20  Vers to match.  
29b40 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
29b50 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74   now stored in t
29b60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29b70 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69  . If writing thi
29b80 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  s .      ** page
29b90 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61   caused the data
29ba0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
29bb0 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65  w, update dbFile
29bc0 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  Size. .      */.
29bd0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
29be0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
29bf0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
29c00 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
29c10 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
29c20 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
29c30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29c40 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
29c50 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
29c60 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
29c70 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
29c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29c90 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
29ca0 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b  GER_STAT_WRITE]+
29cb0 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  +;..      /* Upd
29cc0 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f  ate any backup o
29cd0 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74  bjects copying t
29ce0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
29cf0 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20  his pager. */.  
29d00 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
29d10 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
29d20 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
29d30 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61  u8*)pList->pData
29d40 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54  );..      PAGERT
29d50 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20  RACE(("STORE %d 
29d60 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
29d70 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
29d80 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
29d90 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
29da0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
29db0 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20  pList)));.      
29dc0 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
29dd0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
29de0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  , pgno));.      
29df0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
29e00 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
29e10 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c  _count);.    }el
29e20 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
29e30 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25  RACE(("NOSTORE %
29e40 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
29e50 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
29e60 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
29e70 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
29e80 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ash(pList);.    
29e90 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
29ea0 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65  Dirty;.  }..  re
29eb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29ec0 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  * Ensure that th
29ed0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
29ee0 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69  le is open. If i
29ef0 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
29f00 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n, this .** func
29f10 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
29f20 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
29f30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
29f40 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
29f50 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
29f60 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  n. An .** SQLITE
29f70 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
29f80 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
29f90 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73  d if a call to s
29fa0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a  qlite3OsOpen() .
29fb0 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  ** fails..*/.sta
29fc0 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
29fd0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
29fe0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
29ff0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2a000 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
2a010 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
2a020 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
2a030 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2a040 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2a050 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62  Y || pPager->sub
2a060 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
2a070 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
2a080 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
2a090 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  >sjfd);.    }els
2a0a0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
2a0b0 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
2a0c0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  er, pPager->sjfd
2a0d0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
2a0e0 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  BJOURNAL);.    }
2a0f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
2a110 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
2a120 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
2a130 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
2a140 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
2a150 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2a160 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69  sful, set the bi
2a170 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
2a180 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  to pPg->pgno in 
2a190 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66  the bitvecs.** f
2a1a0 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  or all open save
2a1b0 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65  points before re
2a1c0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  turning..**.** T
2a1d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2a1e0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urns SQLITE_OK i
2a1f0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
2a200 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49  successful, an I
2a210 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  O.** error code 
2a220 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
2a230 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73  o write to the s
2a240 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  ub-journal fails
2a250 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  , or .** SQLITE_
2a260 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
2a270 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65  c fails while se
2a280 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61  tting a bit in a
2a290 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69   savepoint.** bi
2a2a0 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tvec..*/.static 
2a2b0 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  int subjournalPa
2a2c0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
2a2d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a2e0 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
2a2f0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2a300 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ger;.  if( pPage
2a310 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
2a320 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2a330 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a  E_OFF ){..    /*
2a340 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   Open the sub-jo
2a350 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73  urnal, if it has
2a360 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
2a370 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20  n opened */.    
2a380 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a390 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
2a3a0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2a3b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
2a3c0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2a3d0 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ger) );.    asse
2a3e0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2a3f0 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67  r->sjfd) || pPag
2a400 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29  er->nSubRec==0 )
2a410 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
2a420 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2a430 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
2a440 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61  ageInJournal(pPa
2a450 67 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20  ger, pPg) .     
2a460 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
2a470 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
2a480 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
2a490 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
2a4a0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
2a4b0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
2a4c0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
2a4d0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
2a4e0 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
2a4f0 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
2a500 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
2a510 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
2a520 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
2a530 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a540 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
2a550 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
2a560 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
2a570 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65  set = (i64)pPage
2a580 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
2a590 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
2a5a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
2a5b0 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
2a5c0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
2a5d0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
2a5e0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2a5f0 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
2a600 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2a610 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
2a620 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2a630 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2a640 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2a650 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
2a660 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
2a670 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
2a680 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2a690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a6a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2a6b0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2a6c0 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
2a6d0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
2a6e0 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
2a6f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a700 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2a710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
2a720 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
2a730 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2a740 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
2a750 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
2a760 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
2a770 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
2a780 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2a790 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
2a7a0 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
2a7b0 61 67 65 49 66 52 65 71 75 69 72 65 64 28 50 67  ageIfRequired(Pg
2a7c0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
2a7d0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2a7e0 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 65  e(pPg) ){.    re
2a7f0 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c 50  turn subjournalP
2a800 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73  age(pPg);.  }els
2a810 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
2a820 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
2a830 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2a840 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
2a850 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
2a860 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
2a870 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
2a880 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
2a890 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
2a8a0 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
2a8b0 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
2a8c0 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
2a8d0 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
2a8e0 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
2a8f0 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
2a900 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
2a910 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
2a920 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
2a930 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
2a940 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
2a950 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
2a960 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
2a970 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2a980 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
2a990 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
2a9a0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
2a9b0 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
2a9c0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
2a9d0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
2a9e0 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
2a9f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2aa00 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
2aa10 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
2aa20 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
2aa30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2aa40 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
2aa50 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
2aa60 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
2aa70 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2aa80 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
2aa90 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
2aaa0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2aab0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
2aac0 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
2aad0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2aae0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2aaf0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
2ab00 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
2ab10 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
2ab20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2ab30 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
2ab40 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
2ab50 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
2ab60 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
2ab70 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
2ab80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
2ab90 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
2aba0 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
2abb0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2abc0 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
2abd0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
2abe0 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
2abf0 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
2ac00 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
2ac10 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
2ac20 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
2ac30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2ac40 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
2ac50 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
2ac60 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
2ac70 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
2ac80 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
2ac90 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69  tSpill NOSYNC bi
2aca0 74 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  t is set during 
2acb0 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67  times when doing
2acc0 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20   a sync of.  ** 
2acd0 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64  journal (and add
2ace0 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72  ing a new header
2acf0 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  ) is not allowed
2ad00 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20  .  This occurs. 
2ad10 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73   ** during calls
2ad20 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2ad30 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72  Write() while tr
2ad40 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  ying to journal 
2ad50 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61  multiple.  ** pa
2ad60 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ges belonging to
2ad70 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
2ad80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2ad90 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42  doNotSpill ROLLB
2ada0 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74 73  ACK and OFF bits
2adb0 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61   inhibits all ca
2adc0 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a  che spilling.  *
2add0 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * regardless of 
2ade0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2adf0 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
2ae00 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20  d.  This is set 
2ae10 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f  during.  ** a ro
2ae20 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73 65  llback or by use
2ae30 72 20 72 65 71 75 65 73 74 2c 20 72 65 73 70 65  r request, respe
2ae40 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20  ctively..  **.  
2ae50 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61  ** Spilling is a
2ae60 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77  lso prohibited w
2ae70 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20  hen in an error 
2ae80 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61 74  state since that
2ae90 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64   could.  ** lead
2aea0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
2aeb0 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68  ruption.   In th
2aec0 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
2aed0 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a  entation it .  *
2aee0 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  * is impossible 
2aef0 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63 68  for sqlite3Pcach
2af00 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20 63  eFetch() to be c
2af10 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61 74  alled with creat
2af20 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68  eFlag==3.  ** wh
2af30 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ile in the error
2af40 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74   state, hence it
2af50 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
2af60 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
2af70 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65  to.  ** be calle
2af80 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  d in the error s
2af90 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c  tate.  Neverthel
2afa0 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20  ess, we include 
2afb0 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74  a NEVER().  ** t
2afc0 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f  est for the erro
2afd0 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61 66  r state as a saf
2afe0 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66  eguard against f
2aff0 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20  uture changes.. 
2b000 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2b010 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2b020 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2b030 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65 28  _OK;.  testcase(
2b040 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2b050 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2b060 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65  ROLLBACK );.  te
2b070 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2b080 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2b090 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20  LLFLAG_OFF );.  
2b0a0 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2b0b0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2b0c0 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
2b0d0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2b0e0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26  >doNotSpill.   &
2b0f0 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  & ((pPager->doNo
2b100 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46  tSpill & (SPILLF
2b110 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49  LAG_ROLLBACK|SPI
2b120 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a  LLFLAG_OFF))!=0.
2b130 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
2b140 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
2b150 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b  D_SYNC)!=0).  ){
2b160 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b170 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50  TE_OK;.  }..  pP
2b180 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
2b190 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
2b1a0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
2b1b0 2f 2a 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  /* If the transa
2b1c0 63 74 69 6f 6e 20 69 73 20 61 20 22 42 45 47 49  ction is a "BEGI
2b1d0 4e 20 55 4e 4c 4f 43 4b 45 44 22 20 74 72 61 6e  N UNLOCKED" tran
2b1e0 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70 61 67  saction, the pag
2b1f0 65 20 0a 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74  e .    ** cannot
2b200 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64   be flushed to d
2b210 69 73 6b 2e 20 52 65 74 75 72 6e 20 65 61 72 6c  isk. Return earl
2b220 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  y in this case. 
2b230 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
2b240 65 33 57 61 6c 49 73 49 6e 54 72 61 6e 73 28 70  e3WalIsInTrans(p
2b250 50 61 67 65 72 2d 3e 70 57 61 6c 29 3d 3d 30 20  Pager->pWal)==0 
2b260 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2b270 4f 4b 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  OK;..    /* Writ
2b280 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65  e a single frame
2b290 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74   for this page t
2b2a0 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20  o the log. */.  
2b2b0 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
2b2c0 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28  lPageIfRequired(
2b2d0 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20 72  pPg); .    if( r
2b2e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b2f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2b300 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
2b310 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  , pPg, 0, 0);.  
2b320 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a    }.  }else{.  .
2b330 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
2b340 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2b350 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
2b360 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
2b370 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2b380 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  .     || pPager-
2b390 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
2b3a0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
2b3b0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
2b3c0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
2b3d0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ger, 1);.    }. 
2b3e0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
2b3f0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b400 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
2b410 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b420 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  . */.    if( rc=
2b430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b440 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67      assert( (pPg
2b450 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2b460 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
2b470 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2b480 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
2b490 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20  Pager, pPg);.   
2b4a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72   }.  }..  /* Mar
2b4b0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
2b4c0 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ean. */.  if( rc
2b4d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b4e0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2b4f0 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25  STRESS %d page %
2b500 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2b510 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2b520 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ));.    sqlite3P
2b530 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
2b540 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
2b550 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2b560 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a  Pager, rc); .}..
2b570 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2b580 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
2b590 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63   new Pager objec
2b5a0 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  t and put a poin
2b5b0 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20  ter to it.** in 
2b5c0 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61  *ppPager. The pa
2b5d0 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74  ger should event
2b5e0 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62  ually be freed b
2b5f0 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20  y passing it.** 
2b600 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
2b610 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lose()..**.** Th
2b620 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
2b630 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68  ment is the path
2b640 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2b650 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a   file to open..*
2b660 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
2b670 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
2b680 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
2b690 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
2b6a0 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
2b6b0 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
2b6c0 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d  o be cached. Tem
2b6d0 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65  porary files are
2b6e0 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
2b6f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
2b700 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  n they are close
2b710 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  d. If zFilename 
2b720 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
2b730 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72  en .** all infor
2b740 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
2b750 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e  n cache. It is n
2b760 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
2b770 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63  disk. .** This c
2b780 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
2b790 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65  plement an in-me
2b7a0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
2b7b0 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20  *.** The nExtra 
2b7c0 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
2b7d0 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
2b7e0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
2b7f0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c   allocated.** al
2b800 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61  ong with each pa
2b810 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  ge reference. Th
2b820 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69  is space is avai
2b830 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
2b840 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c  r.** via the sql
2b850 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
2b860 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54  a() API..**.** T
2b870 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
2b880 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
2b890 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
2b8a0 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
2b8b0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
2b8c0 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
2b8d0 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
2b8e0 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
2b8f0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
2b900 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e  e PAGER_* flags.
2b910 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c  .**.** The vfsFl
2b920 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  ags parameter is
2b930 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61   a bitmask to pa
2b940 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20  ss to the flags 
2b950 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
2b960 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68  the xOpen() meth
2b970 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  od of the suppli
2b980 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e  ed VFS when open
2b990 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a  ing files. .**.*
2b9a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f  * If the pager o
2b9b0 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
2b9c0 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ed and the speci
2b9d0 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64  fied file opened
2b9e0 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
2b9f0 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y, SQLITE_OK is 
2ba00 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
2ba10 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69  Pager set to poi
2ba20 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77  nt to.** the new
2ba30 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
2ba40 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2ba50 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73  s, *ppPager is s
2ba60 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e  et to NULL.** an
2ba70 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  d error code ret
2ba80 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63  urned. This func
2ba90 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
2baa0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
2bab0 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29  (sqlite3Malloc()
2bac0 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
2bad0 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51  cate memory), SQ
2bae0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72  LITE_CANTOPEN or
2baf0 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c   .** various SQL
2bb00 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72  ITE_IO_XXX error
2bb10 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2bb20 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
2bb30 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2bb40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2bb50 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
2bb60 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
2bb70 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
2bb80 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
2bb90 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
2bba0 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2bbb0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2bbc0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
2bbd0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2bbe0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2bbf0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
2bc00 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
2bc10 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
2bc20 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
2bc30 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2bc40 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2bc50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2bc60 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
2bc70 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
2bc80 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20  nt vfsFlags,    
2bc90 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2bca0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
2bcb0 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
2bcc0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64  Open() */.  void
2bcd0 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
2bce0 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  ge*) /* Function
2bcf0 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   to reinitialize
2bd00 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   pages */.){.  u
2bd10 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
2bd20 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20   *pPager = 0;   
2bd30 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
2bd40 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ect to allocate 
2bd50 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
2bd60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2bd70 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
2bd80 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2bd90 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20   tempFile = 0;  
2bda0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2bdb0 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e  r temp files (in
2bdc0 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  cl. in-memory fi
2bdd0 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  les) */.  int me
2bde0 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mDb = 0;        
2bdf0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2be00 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2be10 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ry file */.  int
2be20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2be30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2be40 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2be50 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2be60 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2be70 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2be80 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2be90 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2bea0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2beb0 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2bec0 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2bed0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2bee0 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2bef0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2bf00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2bf10 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2bf20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2bf30 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2bf40 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2bf50 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2bf60 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2bf70 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2bf80 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2bf90 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2bfa0 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2bfb0 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2bfc0 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2bfd0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2bfe0 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2bff0 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2c000 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2c010 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2c020 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2c030 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2c040 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2c050 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2c060 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2c070 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2c080 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2c090 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2c0a0 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2c0b0 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2c0c0 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2c0d0 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2c0e0 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2c0f0 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2c100 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
2c110 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
2c120 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
2c130 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
2c140 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
2c150 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
2c160 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
2c170 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
2c180 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
2c190 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
2c1a0 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
2c1b0 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
2c1c0 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
2c1d0 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
2c1e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
2c1f0 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
2c200 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
2c210 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2c220 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
2c230 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
2c240 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
2c250 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
2c260 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2c270 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
2c280 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
2c290 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2c2a0 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
2c2b0 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2c2c0 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
2c2d0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2c2e0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2c2f0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
2c300 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
2c310 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
2c320 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
2c330 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
2c340 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
2c350 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23  *ppPager = 0;..#
2c360 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c370 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66  IT_MEMORYDB.  if
2c380 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ( flags & PAGER_
2c390 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65  MEMORY ){.    me
2c3a0 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  mDb = 1;.    if(
2c3b0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2c3c0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2c3d0 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2c3e0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
2c3f0 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  0, zFilename);. 
2c400 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61       if( zPathna
2c410 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20  me==0  ) return 
2c420 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2c430 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2c440 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2c450 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2c460 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
2c470 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2c480 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  f..  /* Compute 
2c490 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
2c4a0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
2c4b0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
2c4c0 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
2c4d0 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
2c4e0 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
2c4f0 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
2c500 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2c510 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
2c520 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
2c530 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
2c540 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
2c550 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2c560 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2c570 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2c580 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2c590 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2c5a0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
2c5b0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  me = sqlite3DbMa
2c5c0 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68  llocRaw(0, nPath
2c5d0 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
2c5e0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
2c5f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2c600 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2c610 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b  }.    zPathname[
2c620 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20  0] = 0; /* Make 
2c630 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  sure initialized
2c640 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74   even if FullPat
2c650 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f  hname() fails */
2c660 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2c670 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
2c680 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
2c690 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
2c6a0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74  hname);.    nPat
2c6b0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2c6c0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2c6d0 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69  e);.    z = zUri
2c6e0 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71   = &zFilename[sq
2c6f0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
2c700 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20  ilename)+1];.   
2c710 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
2c720 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2c730 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2c740 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2c750 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2c760 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d      }.    nUri =
2c770 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a   (int)(&z[1] - z
2c780 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Uri);.    assert
2c790 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20  ( nUri>=0 );.   
2c7a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c7b0 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b  OK && nPathname+
2c7c0 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  8>pVfs->mxPathna
2c7d0 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  me ){.      /* T
2c7e0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
2c7f0 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  ken when the jou
2c800 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72  rnal path requir
2c810 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74  ed by.      ** t
2c820 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
2c830 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  g opened will be
2c840 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d   more than pVfs-
2c850 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20  >mxPathname.    
2c860 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65    ** bytes in le
2c870 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73  ngth. This means
2c880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
2c890 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a  nnot be opened,.
2c8a0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77        ** as it w
2c8b0 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
2c8c0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
2c8d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
2c8e0 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  even.      ** ch
2c8f0 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  eck for a hot-jo
2c900 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61  urnal before rea
2c910 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ding..      */. 
2c920 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c930 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
2c940 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2c950 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c960 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2c970 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2c980 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2c990 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
2c9a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
2c9b0 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
2c9c0 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
2c9d0 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
2c9e0 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
2c9f0 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
2ca00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
2ca10 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
2ca20 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
2ca30 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
2ca40 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
2ca50 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
2ca60 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
2ca70 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2ca80 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
2ca90 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
2caa0 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
2cab0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2cac0 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
2cad0 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
2cae0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2caf0 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
2cb00 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
2cb10 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
2cb20 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
2cb30 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2cb40 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
2cb50 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2cb60 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
2cb70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2cb80 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
2cb90 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2cba0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2cbb0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
2cbc0 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2cbd0 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
2cbe0 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
2cbf0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2cc00 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2cc10 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
2cc20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
2cc30 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
2cc40 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
2cc50 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2cc60 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
2cc70 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
2cc80 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
2cc90 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
2cca0 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
2ccb0 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
2ccc0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2ccd0 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
2cce0 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
2ccf0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2cd00 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
2cd10 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
2cd20 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
2cd30 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2cd40 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20  1 + nUri +      
2cd50 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2cd60 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
2cd70 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20   + 8 + 2        
2cd80 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
2cd90 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  l */.#ifndef SQL
2cda0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2cdb0 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   + nPathname + 4
2cdc0 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2cdd0 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69  /* zWal */.#endi
2cde0 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f.  );.  assert(
2cdf0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2ce00 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
2ce10 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
2ce20 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
2ce30 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
2ce40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2ce50 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2ce60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2ce70 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  OMEM;.  }.  pPag
2ce80 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2ce90 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2cea0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2ceb0 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2cec0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2ced0 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2cee0 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2cef0 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2cf00 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2cf10 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2cf20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2cf30 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2cf40 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2cf50 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2cf60 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2cf70 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2cf80 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2cf90 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2cfa0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2cfb0 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2cfc0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2cfd0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2cfe0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2cff0 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2d000 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2d010 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2d020 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2d030 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2d040 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2d050 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2d060 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61  athname ){.    a
2d070 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65  ssert( nPathname
2d080 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >0 );.    pPager
2d090 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
2d0a0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
2d0b0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2d0c0 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2d0d0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2d0e0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
2d0f0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
2d100 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79  f( nUri ) memcpy
2d110 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  (&pPager->zFilen
2d120 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
2d130 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
2d140 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2d150 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2d160 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2d170 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2d180 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2d190 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2d1a0 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29  urnal\000", 8+2)
2d1b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2d1c0 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2d1d0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2d1e0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23  er->zJournal);.#
2d1f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d200 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2d210 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2d220 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2d230 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2d240 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2d250 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2d260 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d270 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2d280 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2d290 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31   "-wal\000", 4+1
2d2a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2d2b0 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2d2c0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2d2d0 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64  ger->zWal);.#end
2d2e0 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  if.    sqlite3Db
2d2f0 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2d300 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2d310 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2d320 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2d330 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2d340 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2d350 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2d360 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2d370 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2d380 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2d390 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d3a0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2d3b0 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2d3c0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2d3d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2d3e0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2d3f0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2d400 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2d410 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2d420 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20  rt( !memDb );.  
2d430 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2d440 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2d450 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2d460 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2d470 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2d480 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2d490 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2d4a0 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2d4b0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2d4c0 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2d4d0 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2d4e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2d4f0 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2d500 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2d510 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2d520 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2d530 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2d540 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2d550 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2d560 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2d570 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2d580 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2d590 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2d5a0 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2d5b0 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2d5c0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2d5d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d5e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63  ){.      int iDc
2d5f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
2d600 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2d610 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
2d620 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e       if( !readOn
2d630 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  ly ){.        se
2d640 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2d650 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
2d660 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
2d670 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
2d680 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2d690 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
2d6a0 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
2d6b0 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
2d6c0 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
2d6d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2d6e0 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54  sectorSize>SQLIT
2d6f0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2d700 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
2d710 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2d720 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2d730 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d740 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2d750 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
2d760 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32  zPageDflt = (u32
2d770 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
2d780 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
2d790 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
2d7a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2d7b0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2d7c0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2d7d0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
2d7e0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2d7f0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2d800 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2d810 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2d820 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2d830 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
2d840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2d850 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
2d860 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d870 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
2d880 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2d890 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2d8a0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2d8b0 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2d8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2d8d0 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2d8e0 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2d8f0 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2d900 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2d910 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
2d920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2d930 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
2d940 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
2d950 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2d960 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2d970 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2d980 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20  "nolock", 0);.  
2d990 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20 53      if( (iDc & S
2d9a0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55  QLITE_IOCAP_IMMU
2d9b0 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20  TABLE)!=0.      
2d9c0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   || sqlite3_uri_
2d9d0 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d  boolean(zFilenam
2d9e0 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20  e, "immutable", 
2d9f0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
2da00 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  vfsFlags |= SQLI
2da10 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2da20 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2da30 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66   act_like_temp_f
2da40 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
2da50 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2da60 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
2da70 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
2da80 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
2da90 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
2daa0 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
2dab0 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
2dac0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
2dad0 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
2dae0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
2daf0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
2db00 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
2db10 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
2db20 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
2db30 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
2db40 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
2db50 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2db60 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
2db70 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
2db80 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
2db90 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
2dba0 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
2dbb0 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
2dbc0 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
2dbd0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
2dbe0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
2dbf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2dc00 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75  s branch also ru
2dc10 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72  ns for files mar
2dc20 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65  ked as immutable
2dc30 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69  ..    */ .act_li
2dc40 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20  ke_temp_file:.  
2dc50 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
2dc60 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2dc70 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2dc80 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e  R;     /* Preten
2dc90 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  d we already hav
2dca0 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  e a lock */.    
2dcb0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
2dcc0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20  EXCLUSIVE_LOCK; 
2dcd0 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2dce0 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56   are in EXCLUSIV
2dcf0 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50  E mode */.    pP
2dd00 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31  ager->noLock = 1
2dd10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2dd20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e   /* Do no lockin
2dd30 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c  g */.    readOnl
2dd40 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
2dd50 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2dd60 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
2dd70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
2dd80 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
2dd90 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
2dda0 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
2ddb0 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
2ddc0 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
2ddd0 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
2dde0 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
2ddf0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
2de00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2de10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2de20 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
2de30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2de40 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2de50 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
2de60 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
2de70 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
2de80 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
2de90 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2dea0 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
2deb0 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2dec0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ded0 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31  assert( nExtra<1
2dee0 30 30 30 20 29 3b 0a 20 20 20 20 6e 45 78 74 72  000 );.    nExtr
2def0 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
2df00 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  a);.    rc = sql
2df10 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
2df20 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
2df30 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
2df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df50 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
2df60 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
2df70 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2df80 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20  pPCache);.  }.. 
2df90 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2dfa0 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20  occurred above, 
2dfb0 66 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20  free the  Pager 
2dfc0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
2dfd0 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
2dfe0 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
2dff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2e000 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2e010 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
2e020 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
2e030 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
2e040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2e050 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
2e060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2e070 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
2e080 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
2e090 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
2e0a0 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
2e0b0 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
2e0c0 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
2e0d0 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
2e0e0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2e0f0 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
2e100 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
2e110 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a  useJournal;.  /*
2e120 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
2e130 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
2e140 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
2e150 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e160 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
2e170 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e180 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
2e190 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e1a0 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
2e1b0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
2e1c0 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
2e1d0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
2e1e0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
2e1f0 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
2e200 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2e210 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
2e220 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
2e230 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2e240 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38  ->tempFile = (u8
2e250 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73  )tempFile;.  ass
2e260 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
2e270 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2e280 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
2e290 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
2e2a0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e2b0 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
2e2c0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2e2d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2e2e0 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
2e2f0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2e300 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  de = (u8)tempFil
2e310 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  e; .  pPager->ch
2e320 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2e330 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e340 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
2e350 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
2e360 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
2e370 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
2e380 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  ;.  assert( useJ
2e390 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
2e3a0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
2e3b0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
2e3c0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e3d0 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
2e3e0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
2e3f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
2e400 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  ullSync==0 );.  
2e410 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e420 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ->syncFlags==0 )
2e430 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2e440 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
2e450 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2e460 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70  ert( pPager->ckp
2e470 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  tSyncFlags==0 );
2e480 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
2e490 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
2e4a0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2e4b0 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
2e4c0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
2e4d0 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
2e4e0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2e4f0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20  E_SYNC_NORMAL | 
2e500 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
2e510 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65  TIONS;.    pPage
2e520 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2e530 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2e540 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
2e550 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
2e560 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e570 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
2e580 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e590 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
2e5a0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
2e5b0 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74  xtra = (u16)nExt
2e5c0 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
2e5d0 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
2e5e0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2e5f0 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
2e600 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  IT;.  assert( is
2e610 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2e620 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a   || tempFile );.
2e630 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2e640 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
2e650 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
2e660 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2e670 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2e680 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20  URNALMODE_OFF;. 
2e690 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62   }else if( memDb
2e6a0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2e6b0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2e6c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2e6d0 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a  MEMORY;.  }.  /*
2e6e0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
2e6f0 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
2e700 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
2e710 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20  HandlerArg = 0; 
2e720 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  */.  pPager->xRe
2e730 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
2e740 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  ;.  /* memset(pP
2e750 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
2e760 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
2e770 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20  Hash)); */.  /* 
2e780 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
2e790 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2e7a0 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c  MMAP_SIZE // wil
2e7b0 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65  l be set by btre
2e7c0 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  e.c */..  *ppPag
2e7d0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
2e7e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e7f0 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
2e800 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
2e810 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
2e820 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61   deleted or rena
2e830 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  med out from.** 
2e840 75 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e  under the pager.
2e850 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2e860 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61  OK if the databa
2e870 73 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65  se is still were
2e880 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20   it ought.** to 
2e890 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74  be on disk.  Ret
2e8a0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51  urn non-zero (SQ
2e8b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
2e8c0 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74  MOVED or some ot
2e8d0 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  her error.** cod
2e8e0 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73  e from sqlite3Os
2e8f0 41 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65  Access()) if the
2e900 20 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f   database has go
2e910 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73  ne missing..*/.s
2e920 74 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61  tatic int databa
2e930 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65  seIsUnmoved(Page
2e940 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2e950 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b  t bHasMoved = 0;
2e960 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
2e970 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
2e980 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
2e990 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
2e9a0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29  ger->dbSize==0 )
2e9b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e9c0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
2e9d0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26  ger->zFilename &
2e9e0 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  & pPager->zFilen
2e9f0 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d  ame[0] );.  rc =
2ea00 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
2ea10 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
2ea20 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48  , SQLITE_FCNTL_H
2ea30 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d  AS_MOVED, &bHasM
2ea40 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  oved);.  if( rc=
2ea50 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
2ea60 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2ea70 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65  e HAS_MOVED file
2ea80 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d  -control is unim
2ea90 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d  plemented, assum
2eaa0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a  e that the file.
2eab0 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
2eac0 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74  een moved.  That
2ead0 20 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63   is the historic
2eae0 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53  al behavior of S
2eaf0 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a  QLite: prior to.
2eb00 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
2eb10 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63  .8.3, it never c
2eb20 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63  hecked */.    rc
2eb30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2eb40 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2eb50 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d  LITE_OK && bHasM
2eb60 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  oved ){.    rc =
2eb70 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2eb80 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20  _DBMOVED;.  }.  
2eb90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2eba0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ebb0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
2ebc0 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
2ebd0 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
2ebe0 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
2ebf0 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
2ec00 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
2ec10 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2ec20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
2ec30 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2ec40 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
2ec50 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
2ec60 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
2ec70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2ec80 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
2ec90 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
2eca0 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
2ecb0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
2ecc0 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
2ecd0 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
2ece0 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
2ecf0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ed00 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
2ed10 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
2ed20 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
2ed30 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2ed40 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2ed50 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2ed60 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
2ed70 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
2ed80 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
2ed90 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
2eda0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
2edb0 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
2edc0 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
2edd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2ede0 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
2edf0 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
2ee00 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
2ee10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ee20 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
2ee30 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
2ee40 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
2ee50 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
2ee60 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
2ee70 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
2ee80 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
2ee90 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
2eea0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2eeb0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
2eec0 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
2eed0 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
2eee0 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2eef0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2ef00 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
2ef10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2ef20 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
2ef30 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
2ef40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2ef50 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
2ef60 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2ef70 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
2ef80 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
2ef90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2efa0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2efb0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
2efc0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2efd0 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
2efe0 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
2eff0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
2f000 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
2f010 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
2f020 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
2f030 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
2f040 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
2f050 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2f060 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
2f070 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
2f080 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
2f090 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
2f0a0 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
2f0b0 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
2f0c0 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
2f0d0 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
2f0e0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2f0f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2f100 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
2f110 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
2f120 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2f130 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2f140 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2f150 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2f160 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
2f170 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2f180 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2f190 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
2f1a0 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
2f1b0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2f1c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
2f1d0 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
2f1e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2f1f0 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
2f200 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2f210 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
2f220 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
2f230 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
2f240 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
2f250 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2f260 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2f270 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2f280 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20   exists = 1;    
2f290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f2a0 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
2f2b0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
2f2c0 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65  */.  int jrnlOpe
2f2d0 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61  n = !!isOpen(pPa
2f2e0 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73  ger->jfd);..  as
2f2f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2f300 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
2f310 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2f320 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
2f330 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2f340 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2f350 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a   );..  assert( j
2f360 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20  rnlOpen==0 || ( 
2f370 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2f380 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2f390 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20  Pager->jfd) &.  
2f3a0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55    SQLITE_IOCAP_U
2f3b0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
2f3c0 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70  OPEN.  ));..  *p
2f3d0 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66  Exists = 0;.  if
2f3e0 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2f3f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2f400 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
2f410 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2f420 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2f430 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
2f440 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2f450 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
2f460 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  s ){.    int loc
2f470 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
2f480 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2f490 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c  some process hol
2f4a0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2f4b0 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61  ck */..    /* Ra
2f4c0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72  ce condition her
2f4d0 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63  e:  Another proc
2f4e0 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ess might have b
2f4f0 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  een holding the.
2f500 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52      ** the RESER
2f510 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76  VED lock and hav
2f520 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  e a journal open
2f530 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f   at the sqlite3O
2f540 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a  sAccess() .    *
2f550 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75  * call above, bu
2f560 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  t then delete th
2f570 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72  e journal and dr
2f580 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f  op the lock befo
2f590 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74  re.    ** we get
2f5a0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2f5b0 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  g sqlite3OsCheck
2f5c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63  ReservedLock() c
2f5d0 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20  all.  If that.  
2f5e0 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65    ** is the case
2f5f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
2f600 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65  ight think there
2f610 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2f620 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  l when.    ** in
2f630 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e   fact there is n
2f640 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c  one.  This resul
2f650 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f  ts in a false-po
2f660 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c  sitive which wil
2f670 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  l.    ** be deal
2f680 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c  t with by the pl
2f690 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20  ayback routine. 
2f6a0 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20   Ticket #3883.. 
2f6b0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2f6c0 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2f6d0 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
2f6e0 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
2f6f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f700 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64  TE_OK && !locked
2f710 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
2f720 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2f730 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2f740 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
2f750 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2f760 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
2f770 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
2f780 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
2f790 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2f7b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2f7c0 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20  s zero pages in 
2f7d0 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73  size, that means
2f7e0 20 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29   that either (1)
2f7f0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2f800 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d  journal is a rem
2f810 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f  nant from a prio
2f820 72 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  r database with 
2f830 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68  the same name wh
2f840 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ere.        ** t
2f850 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f860 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75   but not the jou
2f870 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64  rnal was deleted
2f880 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69  , or (2) the ini
2f890 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  tial.        ** 
2f8a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
2f8b0 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77   populates a new
2f8c0 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69   database is bei
2f8d0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  ng rolled back..
2f8e0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69          ** In ei
2f8f0 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a  ther case, the j
2f900 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20  ournal file can 
2f910 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77  be deleted.  How
2f920 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a  ever, take care.
2f930 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74          ** not t
2f940 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
2f950 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
2f960 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
2f970 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  due to.        *
2f980 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50  * journal_mode=P
2f990 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20  ERSIST..        
2f9a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  */.        if( n
2f9b0 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c  Page==0 && !jrnl
2f9c0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
2f9d0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
2f9e0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2f9f0 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
2fa00 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
2fa10 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
2fa20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fa30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2fa40 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
2fa50 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2fa60 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2fa70 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
2fa80 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
2fa90 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
2faa0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2fab0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2fac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2fad0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
2fae0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2faf0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2fb00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2fb10 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
2fb20 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
2fb30 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
2fb40 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
2fb50 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2fb60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2fb70 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
2fb80 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
2fb90 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
2fba0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
2fbb0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2fbc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2fbd0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
2fbe0 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
2fbf0 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
2fc00 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
2fc10 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
2fc20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
2fc30 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
2fc40 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2fc50 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
2fc60 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2fc70 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
2fc80 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
2fc90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2fca0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
2fcb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fcc0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2fcd0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2fce0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
2fcf0 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
2fd00 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2fd10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fd20 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
2fd30 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
2fd40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2fd50 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
2fd60 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
2fd70 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
2fd80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2fd90 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
2fda0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
2fdb0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2fdc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2fdd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fde0 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
2fdf0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2fe00 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2fe10 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
2fe20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2fe30 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
2fe40 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
2fe50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2fe60 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2fe70 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
2fe80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
2fe90 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
2fea0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2feb0 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
2fec0 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
2fed0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73         ** it has
2fee0 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20   a zero header, 
2fef0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75  that might be du
2ff00 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f  e to an I/O erro
2ff10 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  r, or.          
2ff20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
2ff30 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65   due to the race
2ff40 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
2ff50 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69  ibed above and i
2ff60 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
2ff70 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20   ticket #3883.  
2ff80 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75  Either way, assu
2ff90 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  me that the jour
2ffa0 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20  nal is hot..    
2ffb0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
2ffc0 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65  might be a false
2ffd0 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20   positive.  But 
2ffe0 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  if it is, then t
2fff0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
30000 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72  * automatic jour
30010 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64  nal playback and
30020 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e   recovery mechan
30030 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20  ism will deal.  
30040 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74            ** wit
30050 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58  h it under an EX
30060 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65  CLUSIVE lock whe
30070 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  re we do not nee
30080 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
30090 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63   ** worry so muc
300a0 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64  h with race cond
300b0 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20  itions..        
300c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
300d0 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
300e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
300f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
30100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30110 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30120 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
30130 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
30140 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30150 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
30160 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
30170 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30180 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
30190 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
301a0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29  e3PagerAcquire()
301b0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69   until after thi
301c0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  s function.** ha
301d0 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
301e0 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61  lly called. If a
301f0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
30200 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65  already held whe
30210 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
30220 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
30230 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
30240 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
30250 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
30260 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62  also performed b
30270 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
30280 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74  .**.**   1) If t
30290 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
302a0 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f  ently in PAGER_O
302b0 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f  PEN state (no lo
302c0 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20  ck held.**      
302d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
302e0 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61  file), then an a
302f0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
30300 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20  o obtain a.**   
30310 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f     SHARED lock o
30320 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30330 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79  ile. Immediately
30340 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
30350 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41  .**      the SHA
30360 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69  RED lock, the fi
30370 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65  le-system is che
30380 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a  cked for a hot-j
30390 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20  ournal,.**      
303a0 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20  which is played 
303b0 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e  back if present.
303c0 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68   Following any h
303d0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  ot-journal .**  
303e0 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68      rollback, th
303f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
30400 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69  e cache are vali
30410 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e  dated by checkin
30420 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63  g.**      the 'c
30430 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66  hange-counter' f
30440 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61  ield of the data
30450 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
30460 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73   and.**      dis
30470 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61  carded if they a
30480 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69  re found to be i
30490 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  nvalid..**.**   
304a0 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  2) If the pager 
304b0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
304c0 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e  clusive-mode, an
304d0 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  d there are curr
304e0 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f  ently.**      no
304f0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
30500 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70  erences to any p
30510 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20  ages, and is in 
30520 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
30530 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e  .**      then an
30540 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
30550 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72   to clear the er
30560 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73  ror state by dis
30570 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  carding.**      
30580 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
30590 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61  the page cache a
305a0 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  nd rolling back 
305b0 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  any open journal
305c0 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a  .**      file..*
305d0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
305e0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
305f0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
30600 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
30610 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
30620 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
30630 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
30640 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
30650 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  t-journal file o
30660 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61  r .** rolling ba
30670 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
30680 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
30690 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
306a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
306b0 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
306c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
306d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
306e0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
306f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30700 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
30710 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
30720 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d  y called from b-
30730 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68  tree and only wh
30740 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  en there are no.
30750 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67    ** outstanding
30760 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70   pages. This imp
30770 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61  lies that the pa
30780 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64  ger state should
30790 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20   either.  ** be 
307a0 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20  OPEN or READER. 
307b0 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70  READER is only p
307c0 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70  ossible if the p
307d0 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69  ager is or was i
307e0 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76  n .  ** exclusiv
307f0 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20  e access mode.. 
30800 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
30810 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
30820 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
30830 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  che)==0 );.  ass
30840 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
30850 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
30860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30870 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30880 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
30890 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
308a0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28  _READER );.  if(
308b0 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20   NEVER(MEMDB && 
308c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
308d0 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65   ){ return pPage
308e0 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20  r->errCode; }.. 
308f0 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
30900 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
30910 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30920 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69  ER_OPEN ){.    i
30930 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  nt bHotJournal =
30940 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   1;          /* 
30950 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
30960 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ists a hot journ
30970 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  al-file */..    
30980 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
30990 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
309a0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
309b0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
309c0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
309d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
309e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
309f0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
30a00 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
30a10 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
30a20 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
30a30 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
30a40 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
30a50 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
30a60 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
30a70 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
30a80 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
30a90 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
30aa0 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
30ab0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
30ac0 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
30ad0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
30ae0 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
30af0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
30b00 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
30b10 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
30b20 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
30b30 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
30b40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30b50 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
30b60 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
30b70 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
30b80 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
30b90 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
30ba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
30bb0 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ONLY_ROLLBACK;. 
30bc0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
30bd0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
30be0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
30bf0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
30c00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30c10 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
30c20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
30c30 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
30c40 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
30c50 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
30c60 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
30c70 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
30c80 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
30c90 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
30ca0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
30cb0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
30cc0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
30cd0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
30ce0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
30cf0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
30d00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
30d10 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
30d20 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
30d30 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
30d40 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
30d50 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
30d60 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
30d70 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
30d80 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
30d90 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
30da0 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
30db0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
30dc0 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
30dd0 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
30de0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30df0 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
30e00 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
30e10 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
30e20 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
30e30 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
30e40 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
30e50 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30e60 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
30e70 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
30e80 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
30e90 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
30ea0 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
30eb0 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
30ec0 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
30ed0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
30ee0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
30ef0 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
30f00 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
30f10 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
30f20 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
30f30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
30f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30f50 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
30f60 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
30f70 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
30f80 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
30f90 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
30fa0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
30fb0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
30fc0 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
30fd0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
30fe0 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
30ff0 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
31000 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
31010 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
31020 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
31030 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
31040 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
31050 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
31060 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
31070 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
31080 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
31090 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
310a0 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
310b0 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
310c0 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
310d0 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
310e0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
310f0 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
31100 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
31110 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
31120 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
31130 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
31140 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
31150 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
31160 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
31170 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
31180 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
31190 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
311a0 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
311b0 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
311c0 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
311d0 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
311e0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
311f0 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
31200 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
31210 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
31220 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
31230 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
31240 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
31250 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
31260 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31270 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
31280 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31290 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
312a0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
312b0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
312c0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
312d0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
312e0 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
312f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
31300 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
31310 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
31320 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
31330 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
31340 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
31350 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
31360 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
31370 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
31380 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
31390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
313a0 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
313b0 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
313c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
313d0 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
313e0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
313f0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
31400 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
31410 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
31420 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
31430 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31440 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
31450 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
31460 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
31470 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
31480 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
31490 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
314a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
314b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
314c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
314d0 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
314e0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
314f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31500 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
31510 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
31520 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
31530 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
31540 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31550 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
31560 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
31570 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
31580 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
31590 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
315a0 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
315b0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
315c0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
315d0 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
315e0 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
315f0 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
31600 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
31610 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
31620 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
31630 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
31640 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
31650 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
31660 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
31670 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
31680 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
31690 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
316a0 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
316b0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
316c0 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
316d0 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
316e0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
316f0 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
31700 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
31710 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
31720 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
31730 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
31740 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
31750 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
31760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31770 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31780 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
31790 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
317a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
317b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
317c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
317d0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
317e0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  1);.          pP
317f0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
31800 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
31810 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
31820 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
31830 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
31840 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
31850 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
31860 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
31870 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
31880 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31890 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
318a0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
318b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
318c0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
318d0 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
318e0 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
318f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
31900 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
31910 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
31920 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
31930 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
31940 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
31950 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
31960 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
31970 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
31980 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
31990 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
319a0 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
319b0 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
319c0 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
319d0 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
319e0 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
319f0 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
31a00 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
31a10 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
31a20 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
31a30 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
31a40 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
31a50 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
31a60 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
31a70 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
31a80 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
31a90 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
31aa0 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
31ab0 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
31ac0 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
31ad0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
31ae0 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
31af0 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
31b00 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
31b10 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
31b20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
31b30 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
31b40 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
31b50 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
31b60 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
31b70 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
31b80 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
31b90 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
31ba0 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
31bb0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
31bc0 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
31bd0 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
31be0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
31bf0 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
31c00 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
31c10 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
31c20 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
31c30 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
31c40 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
31c50 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
31c60 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
31c70 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
31c80 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
31c90 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
31ca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
31cb0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
31cc0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
31cd0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
31ce0 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
31cf0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
31d00 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
31d10 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
31d20 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
31d30 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
31d40 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
31d50 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
31d60 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68  ile && pPager->h
31d70 61 73 42 65 65 6e 55 73 65 64 20 29 7b 0a 20 20  asBeenUsed ){.  
31d80 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
31d90 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
31da0 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 74 68  been acquired th
31db0 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20  en check to.    
31dc0 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20    ** see if the 
31dd0 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
31de0 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
31df0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
31e00 20 63 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20   changed,.      
31e10 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  ** flush the cac
31e20 68 65 2e 20 20 54 68 65 20 70 50 61 67 65 72 2d  he.  The pPager-
31e30 3e 68 61 73 42 65 65 6e 55 73 65 64 20 66 6c 61  >hasBeenUsed fla
31e40 67 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20  g prevents this 
31e50 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63  from.      ** oc
31e60 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76  curring on the v
31e70 65 72 79 20 66 69 72 73 74 20 61 63 63 65 73 73  ery first access
31e80 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f   to a file, in o
31e90 72 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20  rder to save a. 
31ea0 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75       ** single u
31eb0 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69 74  nnecessary sqlit
31ec0 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20  e3OsRead() call 
31ed0 61 74 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e  at the start-up.
31ee0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
31ef0 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
31f00 67 65 73 20 61 72 65 20 64 65 74 65 63 74 65 64  ges are detected
31f10 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
31f20 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
31f30 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  g.      ** at of
31f40 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
31f50 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
31f60 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
31f70 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
31f80 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
31f90 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
31fa0 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
31fb0 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
31fc0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
31fd0 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
31fe0 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
31ff0 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
32000 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
32010 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
32020 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68   ** .      ** Th
32030 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
32040 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
32050 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
32060 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
32070 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
32080 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
32090 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
320a0 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
320b0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74  that.      ** it
320c0 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
320d0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
320e0 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
320f0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  ;.      char dbF
32100 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
32110 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
32120 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  s)];..      rc =
32130 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
32140 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
32150 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
32160 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20  goto failed;..  
32170 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20      if( nPage>0 
32180 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
32190 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
321a0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
321b0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
321c0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
321d0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
321e0 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
321f0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
32200 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
32210 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
32220 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
32230 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
32240 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
32250 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
32260 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
32270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32280 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
32290 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
322a0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
322b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
322c0 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
322d0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
322e0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
322f0 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
32300 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
32310 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  reset(pPager);..
32320 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70          /* Unmap
32330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32340 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62  le. It is possib
32350 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c  le that external
32360 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20   processes.     
32370 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74     ** may have t
32380 72 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74  runcated the dat
32390 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
323a0 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20  hen extended it 
323b0 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  back.        ** 
323c0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
323d0 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20  size while this 
323e0 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20  process was not 
323f0 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a  holding a lock..
32400 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
32410 69 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61  is case there ma
32420 79 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e  y exist a Pager.
32430 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61  pMap mapping tha
32440 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20  t appears.      
32450 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72    ** to be the r
32460 69 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73  ight size but is
32470 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61   not actually va
32480 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a  lid. Avoid this.
32490 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
324a0 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70  bility by unmapp
324b0 69 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e  ing the db here.
324c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
324d0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
324e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
324f0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
32500 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
32510 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32520 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
32530 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
32540 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20  WAL file in the 
32550 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65  file-system, ope
32560 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  n this database 
32570 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f  in WAL.    ** mo
32580 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  de. Otherwise, t
32590 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
325a0 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20  ction call is a 
325b0 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
325c0 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
325d0 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61  WalIfPresent(pPa
325e0 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ger);.#ifndef SQ
325f0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
32600 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32610 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d  ->pWal==0 || rc=
32620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65  =SQLITE_OK );.#e
32630 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
32640 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
32650 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
32660 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
32670 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
32680 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
32690 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
326a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
326b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
326c0 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c  _OPEN && rc==SQL
326d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
326e0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
326f0 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  t(pPager, &pPage
32700 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
32710 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
32720 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32730 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
32740 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
32750 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
32760 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
32770 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32780 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c  ER_OPEN );.  }el
32790 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
327a0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
327b0 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  EADER;.  }.  ret
327c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
327d0 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
327e0 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
327f0 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61  hed zero, rollba
32800 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  ck any active.**
32810 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
32820 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
32830 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  r..**.** Except,
32840 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
32850 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20  =EXCLUSIVE when 
32860 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
32870 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f   to in.** the ro
32880 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
32890 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f  the unlock is no
328a0 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20  t performed and 
328b0 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68  there is.** noth
328c0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ing to rollback,
328d0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
328e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20   is a no-op..*/ 
328f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
32900 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
32910 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
32920 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
32930 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73  MmapOut==0 && (s
32940 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
32950 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
32960 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20  ache)==0) ){.   
32970 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
32980 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
32990 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  .  }.}../*.** Ac
329a0 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
329b0 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  e to page number
329c0 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70   pgno in pager p
329d0 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a  Pager (a page.**
329e0 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74   reference has t
329f0 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66  ype DbPage*). If
32a00 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
32a10 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20  eference is .** 
32a20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74  successfully obt
32a30 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70  ained, it is cop
32a40 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61  ied to *ppPage a
32a50 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
32a60 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
32a70 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
32a80 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
32a90 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69   the cache, it i
32aa0 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
32ab0 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77  Otherwise, a new
32ac0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20   page object is 
32ad0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f  allocated and po
32ae0 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74  pulated with dat
32af0 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74  a.** read from t
32b00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32b10 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c  . In some cases,
32b20 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75   the pcache modu
32b30 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65  le may.** choose
32b40 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65   not to allocate
32b50 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
32b60 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65  ct and may reuse
32b70 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20   an existing.** 
32b80 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f  object with no o
32b90 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
32ba0 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ences..**.** The
32bb0 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
32bc0 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
32bd0 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
32be0 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68  ized to zeros th
32bf0 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65  e .** first time
32c00 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
32c10 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49  d into memory. I
32c20 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65  f the page reque
32c30 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65  sted is .** alre
32c40 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
32c50 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
32c60 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
32c70 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a  hen the extra.**
32c80 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73   data is left as
32c90 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65   it was when the
32ca0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73   page object was
32cb0 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a   last used..**.*
32cc0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
32cd0 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c  e image is small
32ce0 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
32cf0 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66  ested page or if
32d00 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20   a .** non-zero 
32d10 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20  value is passed 
32d20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  as the noContent
32d30 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74   parameter and t
32d40 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
32d50 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
32d60 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74  eady stored in t
32d70 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e  he cache, then n
32d80 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73  o .** actual dis
32d90 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49  k read occurs. I
32da0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
32db0 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
32dc0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20  the .** page is 
32dd0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
32de0 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a  ll zeros. .**.**
32df0 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
32e00 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
32e10 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
32e20 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f  are about the co
32e30 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65  ntents.** of the
32e40 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75   page. This occu
32e50 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  rs in two scenar
32e60 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
32e70 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
32e80 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
32e90 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
32ea0 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
32eb0 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
32ec0 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
32ed0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
32ee0 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
32ef0 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
32f00 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
32f10 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
32f20 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
32f30 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
32f40 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
32f50 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
32f60 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
32f70 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
32f80 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
32f90 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
32fa0 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
32fb0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
32fc0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
32fd0 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
32fe0 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
32ff0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
33000 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
33010 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
33020 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
33030 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
33040 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
33050 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
33060 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
33070 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
33080 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
33090 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
330a0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
330b0 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
330c0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
330d0 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
330e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
330f0 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
33100 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
33110 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
33120 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
33130 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
33140 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
33150 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
33160 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
33170 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
33180 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
33190 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
331a0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
331b0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
331c0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
331d0 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
331e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
331f0 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
33200 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
33210 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
33220 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
33230 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
33240 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
33250 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
33260 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
33270 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
33280 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
33290 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
332a0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
332b0 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
332c0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
332d0 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
332e0 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
332f0 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
33300 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
33310 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
33320 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
33330 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
33340 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
33350 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
33360 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
33370 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
33380 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
33390 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
333a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
333b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
333c0 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
333d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
333e0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
333f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
33400 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
33410 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
33420 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
33430 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
33440 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
33450 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
33460 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
33470 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  _XXX flags */.){
33480 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33490 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
334a0 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69  pPg = 0;.  u32 i
334b0 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  Frame = 0;      
334c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
334d0 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ame to read from
334e0 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63   WAL file */.  c
334f0 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  onst int noConte
33500 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  nt = (flags & PA
33510 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
33520 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  T);..  /* It is 
33530 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73  acceptable to us
33540 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d  e a read-only (m
33550 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e  map) page for an
33560 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20  y page except.  
33570 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65  ** page 1 if the
33580 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  re is no write-t
33590 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20  ransaction open 
335a0 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52  or the ACQUIRE_R
335b0 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61  EADONLY.  ** fla
335c0 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20  g was specified 
335d0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41  by the caller. A
335e0 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68  nd so long as th
335f0 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20  e db is not a . 
33600 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72   ** temporary or
33610 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
33620 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  ase.  */.  const
33630 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28   int bMmapOk = (
33640 70 67 6e 6f 21 3d 31 20 26 26 20 55 53 45 46 45  pgno!=1 && USEFE
33650 54 43 48 28 70 50 61 67 65 72 29 0a 20 20 20 26  TCH(pPager).   &
33660 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
33670 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
33680 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45  || (flags & PAGE
33690 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29  R_GET_READONLY))
336a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
336b0 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70  AS_CODEC.   && p
336c0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30  Pager->xCodec==0
336d0 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20  .#endif.  );..  
336e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
336f0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
33700 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
33710 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
33720 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
33730 20 20 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74    assert( noCont
33740 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f  ent==0 || bMmapO
33750 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  k==0 );..  if( p
33760 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
33770 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
33780 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
33790 70 50 61 67 65 72 2d 3e 68 61 73 42 65 65 6e 55  pPager->hasBeenU
337a0 73 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  sed = 1;..  /* I
337b0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
337c0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
337d0 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
337e0 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  or immediately. 
337f0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
33800 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67   request the pag
33810 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68  e from the PCach
33820 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66  e layer. */.  if
33830 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
33840 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e!=SQLITE_OK ){.
33850 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
33860 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
33870 65 7b 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70  e{.    if( bMmap
33880 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61  Ok && pagerUseWa
33890 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
338a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
338b0 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
338c0 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20  er->pWal, pgno, 
338d0 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20  &iFrame);.      
338e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
338f0 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61  K ) goto pager_a
33900 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
33910 7d 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70  }..    if( bMmap
33920 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30 20  Ok && iFrame==0 
33930 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
33940 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Data = 0;..     
33950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
33960 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
33970 20 0a 20 20 20 20 20 20 20 20 20 20 28 69 36 34   .          (i64
33980 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67  )(pgno-1) * pPag
33990 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
339a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
339b0 26 70 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a  &pData.      );.
339c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
339d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74  QLITE_OK && pDat
339e0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  a ){.        if(
339f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
33a00 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a  PAGER_READER ){.
33a10 20 20 20 20 20 20 20 20 20 20 70 50 67 20 3d 20            pPg = 
33a20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
33a30 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
33a40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33a50 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
33a60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
33a70 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
33a80 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e  Page(pPager, pgn
33a90 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b  o, pData, &pPg);
33aa0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
33ab0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33ac0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
33ad0 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
33ae0 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67  o-1)*pPager->pag
33af0 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20  eSize, pData);. 
33b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33b10 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
33b20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
33b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
33b40 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65           *ppPage
33b50 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20   = pPg;.        
33b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33b70 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
33b80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
33b90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33ba0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
33bb0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
33bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
33bd0 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
33be0 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20  te3_pcache_page 
33bf0 2a 70 42 61 73 65 3b 0a 20 20 20 20 20 20 70 42  *pBase;.      pB
33c00 61 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ase = sqlite3Pca
33c10 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
33c20 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
33c30 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  3);.      if( pB
33c40 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ase==0 ){.      
33c50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
33c60 61 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28  acheFetchStress(
33c70 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
33c80 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a   pgno, &pBase);.
33c90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
33ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
33cb0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
33cc0 72 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rr;.        if( 
33cd0 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pBase==0 ){.    
33ce0 20 20 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50        pPg = *ppP
33cf0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
33d00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
33d10 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
33d20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
33d30 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20  re_err;.        
33d40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
33d50 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
33d60 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
33d70 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d  chFinish(pPager-
33d80 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
33d90 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 61 73  pBase);.      as
33da0 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a  sert( pPg!=0 );.
33db0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
33dc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33dd0 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
33de0 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
33df0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
33e00 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
33e10 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
33e20 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
33e30 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
33e40 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
33e50 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
33e60 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
33e70 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
33e80 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
33e90 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
33ea0 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
33eb0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
33ec0 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
33ed0 73 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70  ssert( pPg==(*pp
33ee0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
33ef0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67  t( pPg->pgno==pg
33f00 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
33f10 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
33f20 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67  ger || pPg->pPag
33f30 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  er==0 );..  if( 
33f40 70 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21  pPg->pPager && !
33f50 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
33f60 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
33f70 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65   the pcache alre
33f80 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ady contains an 
33f90 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79  initialized copy
33fa0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   of.    ** the p
33fb0 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68  age. Return with
33fc0 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e  out further ado.
33fd0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
33fe0 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58   pgno<=PAGER_MAX
33ff0 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50  _PGNO && pgno!=P
34000 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
34010 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67  ger) );.    pPag
34020 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
34030 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20  STAT_HIT]++;.   
34040 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34050 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K;..  }else{.   
34060 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
34070 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
34080 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
34090 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
340a0 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
340b0 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20  ialized.  */..  
340c0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
340d0 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  pPager;..    /* 
340e0 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
340f0 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
34100 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
34110 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
34120 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  .    ** number g
34130 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
34140 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20  , or the unused 
34150 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73  locking-page, is
34160 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20   requested. */. 
34170 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45     if( pgno>PAGE
34180 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
34190 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
341a0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
341b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
341c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
341d0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
341e0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
341f0 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ..    if( MEMDB 
34200 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
34210 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  e<pgno || noCont
34220 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ent || !isOpen(p
34230 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
34240 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
34250 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
34260 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
34270 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
34280 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34290 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
342a0 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
342b0 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
342c0 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
342d0 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
342e0 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
342f0 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
34300 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
34310 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
34320 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
34330 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
34340 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
34350 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
34360 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
34370 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
34380 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
34390 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
343a0 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
343b0 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
343c0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
343d0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
343e0 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
343f0 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
34400 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
34410 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
34420 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
34430 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
34440 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
34450 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
34460 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
34470 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
34480 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
34490 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
344a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
344b0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
344c0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
344d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
344e0 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
344f0 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
34500 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
34510 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
34520 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
34530 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
34540 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
34550 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
34560 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
34570 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
34580 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
34590 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
345a0 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
345b0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
345c0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
345d0 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73       if( pagerUs
345e0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
345f0 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20  bMmapOk==0 ){.  
34600 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34610 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
34620 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
34630 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
34640 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34650 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61  ITE_OK ) goto pa
34660 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
34680 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
34690 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
346a0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
346b0 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53  t[PAGER_STAT_MIS
346c0 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d  S]++;.      rc =
346d0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
346e0 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
346f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
34710 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34720 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
34730 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
34740 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
34750 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
34760 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
34770 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
34780 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
34790 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
347a0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
347b0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
347c0 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
347d0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
347e0 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
347f0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
34800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
34810 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
34820 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
34830 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
34840 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
34850 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
34860 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
34870 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
34880 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
34890 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
348a0 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a  in cache. .**.**
348b0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
348c0 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
348d0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
348e0 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
348f0 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
34900 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
34910 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
34920 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
34930 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
34940 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
34950 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
34960 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
34970 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
34980 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
34990 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
349a0 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
349b0 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
349c0 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
349d0 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
349e0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
349f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
34a00 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71  Pgno pgno){.  sq
34a10 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67  lite3_pcache_pag
34a20 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
34a30 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
34a40 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
34a50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
34a60 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21  pPager->pPCache!
34a70 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
34a80 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34a90 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
34aa0 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  he, pgno, 0);.  
34ab0 61 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30  assert( pPage==0
34ac0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 42   || pPager->hasB
34ad0 65 65 6e 55 73 65 64 20 29 3b 0a 20 20 69 66 28  eenUsed );.  if(
34ae0 20 70 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75   pPage==0 ) retu
34af0 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73  rn 0;.  return s
34b00 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34b10 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
34b20 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
34b30 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
34b40 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72  Release a page r
34b50 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  eference..**.** 
34b60 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
34b70 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
34b80 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
34b90 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
34ba0 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
34bb0 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
34bc0 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
34bd0 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
34be0 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
34bf0 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
34c00 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
34c10 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
34c20 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
34c30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
34c40 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
34c50 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ll(DbPage *pPg){
34c60 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
34c70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ;.  assert( pPg!
34c80 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  =0 );.  pPager =
34c90 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
34ca0 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26  if( pPg->flags &
34cb0 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20   PGHDR_MMAP ){. 
34cc0 20 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d     pagerReleaseM
34cd0 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d  apPage(pPg);.  }
34ce0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
34cf0 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
34d00 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
34d10 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
34d20 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73  Pager);.}.void s
34d30 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
34d40 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
34d50 20 69 66 28 20 70 50 67 20 29 20 73 71 6c 69 74   if( pPg ) sqlit
34d60 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
34d70 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ull(pPg);.}../*.
34d80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34d90 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
34da0 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
34db0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
34dc0 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
34dd0 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
34de0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
34df0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
34e00 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
34e10 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
34e20 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
34e30 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
34e40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
34e50 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
34e60 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
34e70 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
34e80 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
34e90 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
34ea0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
34eb0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
34ec0 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
34ed0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
34ee0 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
34ef0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
34f00 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
34f10 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
34f20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
34f30 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
34f40 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
34f50 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
34f60 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
34f70 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
34f80 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
34f90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
34fa0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
34fb0 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
34fc0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
34fd0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
34fe0 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
34ff0 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
35000 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
35010 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
35020 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
35030 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
35040 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
35050 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
35060 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
35070 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
35080 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
35090 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
350a0 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
350b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
350c0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
350d0 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
350e0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
350f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
35100 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
35110 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
35120 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
35130 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
35140 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
35150 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
35160 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35170 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
35180 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
35190 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
351a0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
351b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
351c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
351e0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
351f0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
35200 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
35210 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
35220 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
35230 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
35240 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35250 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
35260 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
35270 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
35280 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
35290 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
352a0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
352b0 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
352c0 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
352d0 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
352e0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
352f0 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20  p.  But on.  ** 
35300 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
35310 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
35320 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20  never called if 
35330 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
35340 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
35350 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
35360 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
35370 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
35380 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
35390 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
353a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
353b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
353c0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
353d0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
353e0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
353f0 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
35400 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
35410 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
35420 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
35430 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
35440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35450 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
35460 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
35470 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
35480 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
35490 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20  dy open. */.    
354a0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
354b0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
354c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
354d0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
354e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
354f0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ORY ){.        s
35500 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
35510 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
35520 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
35530 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
35540 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
35550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
35560 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
35570 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
35580 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
35590 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
355a0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
355b0 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ATE|.          (
355c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
355d0 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   ? .            
355e0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
355f0 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
35600 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
35610 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20  NAL):.          
35620 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d    (SQLITE_OPEN_M
35630 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20  AIN_JOURNAL).   
35640 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20         );..     
35650 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
35660 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
35670 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d  till has the sam
35680 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64  e name as it did
35690 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
356a0 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c   it was original
356b0 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  ly opened. */.  
356c0 20 20 20 20 20 20 72 63 20 3d 20 64 61 74 61 62        rc = datab
356d0 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61  aseIsUnmoved(pPa
356e0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
356f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35700 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
35710 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
35720 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 72  RITE.          r
35730 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
35740 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
35750 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
35760 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
35770 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
35780 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
35790 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 20  (pPager).       
357a0 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
357b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
357c0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
357d0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
357e0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
357f0 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ags, 0);.#endif.
35800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35810 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
35820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
35830 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
35840 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  jfd) );.    }.  
35850 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
35860 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
35870 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
35880 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
35890 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d open .    ** t
358a0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
358b0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
358c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
358d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
358e0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
358f0 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
35900 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
35910 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
35920 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
35930 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
35940 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
35950 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
35960 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
35970 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
35980 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  alHdr = 0;.     
35990 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
359a0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
359b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
359c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
359d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
359e0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
359f0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
35a00 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
35a10 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  urnal = 0;.  }el
35a20 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
35a30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35a40 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
35a50 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65  KED );.    pPage
35a60 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
35a70 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
35a80 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  D;.  }..  return
35a90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
35aa0 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
35ab0 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
35ac0 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
35ad0 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
35ae0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
35af0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
35b00 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
35b10 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
35b20 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
35b30 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
35b40 74 20 69 73 20 30 2c 20 74 68 65 6e 20 61 63 71  t is 0, then acq
35b50 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
35b60 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
35b70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35b80 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
35b90 20 69 73 20 3e 30 2c 20 74 68 65 6e 20 61 63 71   is >0, then acq
35ba0 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
35bb0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
35bc0 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
35bd0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
35be0 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
35bf0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
35c00 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
35c10 2a 2a 20 49 66 20 28 65 78 46 6c 61 67 3c 30 29  ** If (exFlag<0)
35c20 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
35c30 65 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65  e is in WAL mode
35c40 2c 20 64 6f 20 6e 6f 74 20 74 61 6b 65 20 61 6e  , do not take an
35c50 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 54 68 65 20  y locks..** The 
35c60 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
35c70 20 72 75 6e 20 69 6e 20 55 4e 4c 4f 43 4b 45 44   run in UNLOCKED
35c80 20 6d 6f 64 65 20 69 6e 73 74 65 61 64 2e 0a 2a   mode instead..*
35c90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a  *.** If the subj
35ca0 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
35cb0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
35cc0 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72  hen any sub-jour
35cd0 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69  nal opened.** wi
35ce0 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
35cf0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70  ction will be op
35d00 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
35d10 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a  mory file. This.
35d20 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ** has no effect
35d30 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   if the sub-jour
35d40 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f  nal is already o
35d50 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79  pened (as it may
35d60 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e   be when.** runn
35d70 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
35d80 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65   mode) or if the
35d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65   transaction doe
35da0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  s not require a.
35db0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ** sub-journal. 
35dc0 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
35dd0 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
35de0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72  zero, then any r
35df0 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a  equired.** sub-j
35e00 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d  ournal is implem
35e10 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  ented in-memory 
35e20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20  if pPager is an 
35e30 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
35e40 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67  se, .** or using
35e50 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
35e60 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
35e70 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
35e80 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
35e90 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c  ger, int exFlag,
35ea0 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   int subjInMemor
35eb0 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  y){.  int rc = S
35ec0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
35ed0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
35ee0 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
35ef0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73  ->errCode;.  ass
35f00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35f10 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
35f20 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
35f30 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20  ate<PAGER_ERROR 
35f40 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62  );.  pPager->sub
35f50 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29  jInMemory = (u8)
35f60 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20  subjInMemory;.. 
35f70 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67   if( ALWAYS(pPag
35f80 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
35f90 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20  R_READER) ){.   
35fa0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35fb0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
35fc0 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
35fd0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
35fe0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
35ff0 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
36000 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
36010 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
36020 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
36030 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
36040 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
36050 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
36060 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
36070 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
36080 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
36090 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
360a0 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78   && sqlite3WalEx
360b0 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
360c0 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
360d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
360e0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
360f0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
36100 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
36110 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36120 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
36130 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
36140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
36150 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
36160 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b  Pager->pWal, 1);
36170 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
36180 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74  /* Grab the writ
36190 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f  e lock on the lo
361a0 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  g file. If succe
361b0 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74  ssful, upgrade t
361c0 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52  o.      ** PAGER
361d0 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
361e0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
361f0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
36200 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
36210 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73        ** The bus
36220 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74  y-handler is not
36230 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74   invoked if anot
36240 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  her connection a
36250 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20  lready.      ** 
36260 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d  holds the write-
36270 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c  lock. If possibl
36280 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  e, the upper lay
36290 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e  er will call it.
362a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
362b0 69 66 28 20 65 78 46 6c 61 67 3e 3d 30 20 29 7b  if( exFlag>=0 ){
362c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
362d0 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69  lite3WalBeginWri
362e0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
362f0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
36300 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
36310 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
36320 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
36330 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36340 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
36350 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
36360 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
36370 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
36380 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
36390 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
363a0 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ck. The.      **
363b0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
363c0 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
363d0 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
363e0 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
363f0 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  VE.      ** lock
36400 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
36410 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
36420 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
36430 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
36440 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
36450 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
36460 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
36470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
36480 78 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20 20  xFlag>0 ){.     
36490 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
364a0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
364b0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
364c0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
364d0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
364e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
364f0 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57    /* Change to W
36500 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
36510 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
36520 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
36530 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65  ets Pager.eState
36540 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52   to PAGER_WRITER
36550 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45  _LOCKED or CACHE
36560 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  MOD.      ** whe
36570 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e  n it has an open
36580 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
36590 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44  t never to DBMOD
365a0 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20   or FINISHED..  
365b0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
365c0 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20  ecause in those 
365d0 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  states the code 
365e0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
365f0 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
36600 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61   transactions ma
36610 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  y copy data from
36620 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
36630 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
36640 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  se .      ** fil
36650 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74  e as well as int
36660 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
36670 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
36680 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20   incorrect in . 
36690 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
366a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
366b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
366c0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  = PAGER_WRITER_L
366d0 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61  OCKED;.      pPa
366e0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
366f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
36700 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36710 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61  dbFileSize = pPa
36720 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
36730 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
36740 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
36750 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
36760 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
36770 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
36780 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
36790 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
367a0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
367b0 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73  READER );.    as
367c0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
367d0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
367e0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
367f0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
36800 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
36810 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
36820 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50  ger) );.  }..  P
36830 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
36840 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
36850 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
36860 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
36870 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61  ../*.** Write pa
36880 67 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20  ge pPg onto the 
36890 65 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  end of the rollb
368a0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ack journal..*/.
368b0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
368c0 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72  INLINE int pager
368d0 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63  AddPageToRollbac
368e0 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a  kJournal(PgHdr *
368f0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
36900 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
36910 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ger;.  int rc;. 
36920 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68   u32 cksum;.  ch
36930 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36  ar *pData2;.  i6
36940 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  4 iOff = pPager-
36950 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
36960 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
36970 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
36980 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
36990 20 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20   page that.  ** 
369a0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
369b0 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
369c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
369d0 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a  rt verifies.  **
369e0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
369f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
36a00 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
36a10 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
36a20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
36a30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c  ger->journalHdr<
36a40 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
36a50 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28  Off );.  CODEC2(
36a60 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
36a70 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
36a80 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
36a90 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
36aa0 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
36ab0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
36ac0 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 2f  8*)pData2);..  /
36ad0 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
36ae0 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
36af0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a  r occurs while j
36b00 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
36b10 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
36b20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74  block above, set
36b30 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66   the need-sync f
36b40 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65  lag for the page
36b50 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
36b60 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  , when the trans
36b70 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
36b80 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63   back, the logic
36b90 20 69 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61 63   in.  ** playbac
36ba0 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c  k_one_page() wil
36bb0 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65  l think that the
36bc0 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
36bd0 65 20 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a 20  e restored.  ** 
36be0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
36bf0 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
36c00 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
36c10 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
36c20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70    ** then corrup
36c30 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e  tion may follow.
36c40 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61  .  */.  pPg->fla
36c50 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
36c60 5f 53 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20 77  _SYNC;..  rc = w
36c70 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
36c80 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50  r->jfd, iOff, pP
36c90 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  g->pgno);.  if( 
36ca0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
36cb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
36cc0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
36cd0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
36ce0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
36cf0 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b  geSize, iOff+4);
36d00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
36d10 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
36d20 3b 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ;.  rc = write32
36d30 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
36d40 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70  , iOff+pPager->p
36d50 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d  ageSize+4, cksum
36d60 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
36d70 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
36d80 72 63 3b 0a 0a 20 20 49 4f 54 52 41 43 45 28 28  rc;..  IOTRACE((
36d90 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
36da0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
36db0 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
36dc0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
36dd0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
36de0 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
36df0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
36e00 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
36e10 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
36e20 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20  TRACE(("JOURNAL 
36e30 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
36e40 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
36e50 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 50 41 47  )\n",.       PAG
36e60 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
36e70 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
36e80 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
36e90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
36ea0 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
36eb0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 70  ash(pPg)));..  p
36ec0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
36ed0 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d  f += 8 + pPager-
36ee0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61  >pageSize;.  pPa
36ef0 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61  ger->nRec++;.  a
36f00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
36f10 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
36f20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
36f30 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
36f40 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
36f50 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61  >pgno);.  testca
36f60 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
36f70 4f 4d 45 4d 20 29 3b 0a 20 20 61 73 73 65 72 74  OMEM );.  assert
36f80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36f90 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
36fa0 4d 45 4d 20 29 3b 0a 20 20 72 63 20 7c 3d 20 61  MEM );.  rc |= a
36fb0 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
36fc0 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
36fd0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  ->pgno);.  asser
36fe0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
36ff0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
37000 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e  OMEM );.  return
37010 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
37020 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  rk a single data
37030 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
37040 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
37050 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
37060 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   .** main journa
37070 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
37080 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   as required. If
37090 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
370a0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65  tten into.** one
370b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
370c0 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
370d0 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
370e0 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e  n the .** Pager.
370f0 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
37100 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  c and the PagerS
37110 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
37120 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a  point bitvecs.**
37130 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76   of any open sav
37140 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f  epoints as appro
37150 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
37160 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
37170 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
37180 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
37190 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
371a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
371b0 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72  OK;..  /* This r
371c0 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61  outine is not ca
371d0 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72  lled unless a wr
371e0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
371f0 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a  has already .  *
37200 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20  * been started. 
37210 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
37220 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
37230 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20  be open at this 
37240 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69  point..  ** It i
37250 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
37260 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
37270 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
37280 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37290 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
372a0 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
372b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
372c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
372d0 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
372e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
372f0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
37300 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
37310 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
37320 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
37330 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37340 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a  ->errCode==0 );.
37350 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37360 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
37370 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
37380 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f  g);..  /* The jo
37390 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
373a0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48   to be opened. H
373b0 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74  igher level rout
373c0 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ines have alread
373d0 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20  y.  ** obtained 
373e0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  the necessary lo
373f0 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65  cks to begin the
37400 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
37410 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a  on, but the.  **
37420 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
37430 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20  l might not yet 
37440 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74  be open. Open it
37450 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20   now if this is 
37460 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  the case..  **. 
37470 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65   ** This is done
37480 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
37490 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
374a0 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20  eDirty() on the 
374b0 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  page. .  ** Othe
374c0 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72  rwise, if it wer
374d0 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c  e done after cal
374e0 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
374f0 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74  heMakeDirty(), t
37500 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f  hen.  ** an erro
37510 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e  r might occur an
37520 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c  d the pager woul
37530 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54  d end up in WRIT
37540 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a  ER_LOCKED state.
37550 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20    ** with pages 
37560 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
37570 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20  in the cache..  
37580 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
37590 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
375a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
375b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
375c0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
375d0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
375e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
375f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
37600 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
37610 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
37620 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
37630 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
37640 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
37650 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  er) );..  /* Mar
37660 6b 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  k the page that 
37670 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 6d  is about to be m
37680 6f 64 69 66 69 65 64 20 61 73 20 64 69 72 74 79  odified as dirty
37690 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63  . */.  sqlite3Pc
376a0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
376b0 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 72  g);..  /* If a r
376c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
376d0 69 73 20 69 6e 20 75 73 65 2c 20 74 68 65 6d 20  is in use, them 
376e0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 61  make sure the pa
376f0 67 65 20 74 68 61 74 20 69 73 20 61 62 6f 75 74  ge that is about
37700 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  .  ** to change 
37710 69 73 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  is in the rollba
37720 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ck journal, or i
37730 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20  f the page is a 
37740 6e 65 77 20 70 61 67 65 20 6f 66 66 0a 20 20 2a  new page off.  *
37750 2a 20 74 68 65 6e 20 65 6e 64 20 6f 66 20 74 68  * then end of th
37760 65 20 66 69 6c 65 2c 20 6d 61 6b 65 20 73 75 72  e file, make sur
37770 65 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61  e it is marked a
37780 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s PGHDR_NEED_SYN
37790 43 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  C..  */.  assert
377a0 28 20 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  ( (pPager->pInJo
377b0 75 72 6e 61 6c 21 3d 30 29 20 3d 3d 20 69 73 4f  urnal!=0) == isO
377c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
377d0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
377e0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 0a  ->pInJournal!=0.
377f0 20 20 20 26 26 20 73 71 6c 69 74 65 33 42 69 74     && sqlite3Bit
37800 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70  vecTestNotNull(p
37810 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37820 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3d 3d 30  l, pPg->pgno)==0
37830 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
37840 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
37850 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ager)==0 );.    
37860 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  if( pPg->pgno<=p
37870 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
37880 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
37890 70 61 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f  pagerAddPageToRo
378a0 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 70 50  llbackJournal(pP
378b0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
378c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
378d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
378e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
378f0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
37900 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
37910 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
37920 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  D ){.        pPg
37930 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
37940 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
37950 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54    }.      PAGERT
37960 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64  RACE(("APPEND %d
37970 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
37980 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
37990 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
379a0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
379b0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
379c0 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
379d0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
379e0 30 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  0)));.    }.  }.
379f0 0a 20 20 2f 2a 20 54 68 65 20 50 47 48 44 52 5f  .  /* The PGHDR_
37a00 44 49 52 54 59 20 62 69 74 20 69 73 20 73 65 74  DIRTY bit is set
37a10 20 61 62 6f 76 65 20 77 68 65 6e 20 74 68 65 20   above when the 
37a20 70 61 67 65 20 77 61 73 20 61 64 64 65 64 20 74  page was added t
37a30 6f 20 74 68 65 20 64 69 72 74 79 2d 6c 69 73 74  o the dirty-list
37a40 0a 20 20 2a 2a 20 61 6e 64 20 62 65 66 6f 72 65  .  ** and before
37a50 20 77 72 69 74 69 6e 67 20 74 68 65 20 70 61 67   writing the pag
37a60 65 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  e into the rollb
37a70 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 61  ack journal.  Wa
37a80 69 74 20 75 6e 74 69 6c 20 6e 6f 77 2c 0a 20 20  it until now,.  
37a90 2a 2a 20 61 66 74 65 72 20 74 68 65 20 70 61 67  ** after the pag
37aa0 65 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65  e has been succe
37ab0 73 73 66 75 6c 6c 79 20 6a 6f 75 72 6e 61 6c 6c  ssfully journall
37ac0 65 64 2c 20 62 65 66 6f 72 65 20 73 65 74 74 69  ed, before setti
37ad0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 50 47 48 44  ng the.  ** PGHD
37ae0 52 5f 57 52 49 54 45 41 42 4c 45 20 62 69 74 20  R_WRITEABLE bit 
37af0 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74  that indicates t
37b00 68 61 74 20 74 68 65 20 70 61 67 65 20 63 61 6e  hat the page can
37b10 20 62 65 20 73 61 66 65 6c 79 20 6d 6f 64 69 66   be safely modif
37b20 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ied..  */.  pPg-
37b30 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
37b40 57 52 49 54 45 41 42 4c 45 3b 0a 20 20 0a 20 20  WRITEABLE;.  .  
37b50 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
37b60 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
37b70 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
37b80 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
37b90 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
37ba0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
37bb0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
37bc0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  al..  */.  if( p
37bd0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
37be0 74 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  t>0 ){.    rc = 
37bf0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
37c00 52 65 71 75 69 72 65 64 28 70 50 67 29 3b 0a 20  Required(pPg);. 
37c10 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
37c20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
37c30 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 20 2a 2f  e and return. */
37c40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
37c50 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20  bSize<pPg->pgno 
37c60 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
37c70 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
37c80 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
37c90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
37ca0 73 20 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f  s is a variant o
37cb0 66 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  f sqlite3PagerWr
37cc0 69 74 65 28 29 20 74 68 61 74 20 72 75 6e 73 20  ite() that runs 
37cd0 77 68 65 6e 20 74 68 65 20 73 65 63 74 6f 72 20  when the sector 
37ce0 73 69 7a 65 0a 2a 2a 20 69 73 20 6c 61 72 67 65  size.** is large
37cf0 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20  r than the page 
37d00 73 69 7a 65 2e 20 20 53 51 4c 69 74 65 20 6d 61  size.  SQLite ma
37d10 6b 65 73 20 74 68 65 20 28 72 65 61 73 6f 6e 61  kes the (reasona
37d20 62 6c 65 29 20 61 73 73 75 6d 70 74 69 6f 6e 20  ble) assumption 
37d30 74 68 61 74 0a 2a 2a 20 61 6c 6c 20 62 79 74 65  that.** all byte
37d40 73 20 6f 66 20 61 20 73 65 63 74 6f 72 20 61 72  s of a sector ar
37d50 65 20 77 72 69 74 74 65 6e 20 74 6f 67 65 74 68  e written togeth
37d60 65 72 20 62 79 20 68 61 72 64 77 61 72 65 2e 20  er by hardware. 
37d70 20 48 65 6e 63 65 2c 20 61 6c 6c 20 62 79 74 65   Hence, all byte
37d80 73 20 6f 66 0a 2a 2a 20 61 20 73 65 63 74 6f 72  s of.** a sector
37d90 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
37da0 6e 61 6c 6c 65 64 20 69 6e 20 63 61 73 65 20 6f  nalled in case o
37db0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 69  f a power loss i
37dc0 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
37dd0 2a 2a 20 61 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a  ** a write..**.*
37de0 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 73  * Usually, the s
37df0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 6c 65  ector size is le
37e00 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
37e10 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
37e20 65 2c 20 69 6e 20 77 68 69 63 68 0a 2a 2a 20 63  e, in which.** c
37e30 61 73 65 20 70 61 67 65 73 20 63 61 6e 20 62 65  ase pages can be
37e40 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 77 72   individually wr
37e50 69 74 74 65 6e 2e 20 20 54 68 69 73 20 72 6f 75  itten.  This rou
37e60 74 69 6e 65 20 6f 6e 6c 79 20 72 75 6e 73 20 69  tine only runs i
37e70 6e 20 74 68 65 0a 2a 2a 20 65 78 63 65 70 74 69  n the.** excepti
37e80 6f 6e 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  onal case where 
37e90 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
37ea0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
37eb0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  e sector size..*
37ec0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
37ed0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67  NOINLINE int pag
37ee0 65 72 57 72 69 74 65 4c 61 72 67 65 53 65 63 74  erWriteLargeSect
37ef0 6f 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  or(PgHdr *pPg){.
37f00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37f10 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
37f20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
37f30 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75  .  Pgno nPageCou
37f40 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
37f50 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
37f60 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
37f70 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
37f80 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
37f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
37fa0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
37fb0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
37fc0 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
37fd0 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20  int nPage = 0;  
37fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37ff0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
38000 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
38010 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
38020 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
38030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38040 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
38050 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
38060 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
38070 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
38080 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45  ge has PGHDR_NEE
38090 44 5f 53 59 4e 43 20 2a 2f 0a 20 20 50 61 67 65  D_SYNC */.  Page
380a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
380b0 3e 70 50 61 67 65 72 3b 20 2f 2a 20 54 68 65 20  >pPager; /* The 
380c0 70 61 67 65 72 20 74 68 61 74 20 6f 77 6e 73 20  pager that owns 
380d0 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50  pPg */.  Pgno nP
380e0 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
380f0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
38100 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
38110 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ize);..  /* Set 
38120 74 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  the doNotSpill N
38130 4f 53 59 4e 43 20 62 69 74 20 74 6f 20 31 2e 20  OSYNC bit to 1. 
38140 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
38150 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a  we cannot allow.
38160 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68    ** a journal h
38170 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
38180 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
38190 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
381a0 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  by.  ** this fun
381b0 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  ction..  */.  as
381c0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
381d0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
381e0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
381f0 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43  SPILLFLAG_NOSYNC
38200 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72  )==0 );.  pPager
38210 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
38220 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43  SPILLFLAG_NOSYNC
38230 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 74 72 69  ;..  /* This tri
38240 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
38250 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
38260 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
38270 7a 65 20 61 72 65 0a 20 20 2a 2a 20 61 6e 20 69  ze are.  ** an i
38280 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
38290 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
382a0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
382b0 64 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 6f  dentifier.  ** o
382c0 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
382d0 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
382e0 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
382f0 2e 0a 20 20 2a 2f 0a 20 20 70 67 31 20 3d 20 28  ..  */.  pg1 = (
38300 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
38310 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
38320 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 6e 50 61  -1)) + 1;..  nPa
38330 67 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72  geCount = pPager
38340 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20  ->dbSize;.  if( 
38350 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
38360 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e 50 61 67  ount ){.    nPag
38370 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
38380 20 70 67 31 29 2b 31 3b 0a 20 20 7d 65 6c 73 65   pg1)+1;.  }else
38390 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
383a0 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
383b0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e 50  eCount ){.    nP
383c0 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
383d0 2b 31 2d 70 67 31 3b 0a 20 20 7d 65 6c 73 65 7b  +1-pg1;.  }else{
383e0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  .    nPage = nPa
383f0 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 7d  gePerSector;.  }
38400 0a 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e  .  assert(nPage>
38410 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 67 31  0);.  assert(pg1
38420 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
38430 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
38440 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
38450 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
38460 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
38470 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
38480 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
38490 69 69 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70  ii;.    PgHdr *p
384a0 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 67  Page;.    if( pg
384b0 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
384c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
384d0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
384e0 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
384f0 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
38500 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
38510 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
38520 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
38530 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
38540 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
38550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
38560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
38570 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
38580 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
38590 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
385a0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
385b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
385c0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
385d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
385e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
385f0 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
38600 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
38610 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
38620 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 73 71   if( (pPage = sq
38630 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
38640 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30  (pPager, pg))!=0
38650 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
38660 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
38670 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
38680 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
38690 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
386a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
386b0 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  refNotNull(pPage
386c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
386d0 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f  /* If the PGHDR_
386e0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
386f0 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
38700 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
38710 20 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20   .  ** starting 
38720 61 74 20 70 67 31 2c