/ Hex Artifact Content
Login

Artifact bd9647a741d1905a2a46cc79126ca2d720f33f5d:


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 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b 57    u32 aWalData[W
2660: 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44 41  AL_SAVEPOINT_NDA
2670: 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  TA];        /* W
2680: 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f 6e  AL savepoint con
2690: 74 65 78 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  text */.};../*.*
26a0: 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61  * A open page ca
26b0: 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  che is an instan
26c0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
26d0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
26e0: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
26f0: 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f  **   Pager.errCo
2700: 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  de may be set to
2710: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
2720: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
2730: 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45  r.**   or SQLITE
2740: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
2750: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
2760: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
2770: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
2780: 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e     and is return
2790: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
27a0: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
27b0: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
27c0: 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45   The.**   SQLITE
27d0: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
27e0: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
27f0: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
2800: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
2810: 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75  the.**   next su
2820: 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63  ccessful rollbac
2830: 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  k is performed o
2840: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
2850: 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51  e. Also,.**   SQ
2860: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
2870: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
2880: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2890: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
28a0: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50  Lookup().**   AP
28b0: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
28c0: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
28d0: 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64  ssfully..**.** d
28e0: 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69  bSizeValid, dbSi
28f0: 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20  ze, dbOrigSize, 
2900: 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbFileSize.**.**
2910: 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20     Managing the 
2920: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2930: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
2940: 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63  es is a little c
2950: 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20  omplicated..**  
2960: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
2970: 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61  ger.dbSize conta
2980: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
2990: 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65  f pages that the
29a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69   database.**   i
29b0: 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63  mage currently c
29c0: 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20  ontains. As the 
29d0: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67  database image g
29e0: 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20  rows or shrinks 
29f0: 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62  this.**   variab
2a00: 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54  le is updated. T
2a10: 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65  he variable Page
2a20: 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  r.dbFileSize con
2a30: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
2a40: 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69  .**   of pages i
2a50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a60: 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ile. This may be
2a70: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
2a80: 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20  Pager.dbSize.** 
2a90: 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20    if some pages 
2aa0: 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64  have been append
2ab0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
2ac0: 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74  se image but not
2ad0: 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20   yet written.** 
2ae0: 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63    out from the c
2af0: 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75  ache to the actu
2b00: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
2b10: 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65   Or if the image
2b20: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74   has been.**   t
2b30: 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69  runcated by an i
2b40: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2b50: 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  m operation. The
2b60: 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a   Pager.dbOrigSiz
2b70: 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  e variable.**   
2b80: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
2b90: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2ba0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2bb0: 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ge when the curr
2bc0: 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63  ent.**   transac
2bd0: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
2be0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2bf0: 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68   all three of th
2c00: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73  ese variables is
2c10: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61  .**   only guara
2c20: 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72  nteed to be corr
2c30: 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65  ect if the boole
2c40: 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56  an Pager.dbSizeV
2c50: 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a  alid is true..**
2c60: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65  .**   TODO: Unde
2c70: 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e  r what condition
2c80: 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64  s is dbSizeValid
2c90: 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a   set? Cleared?.*
2ca0: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
2cb0: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
2cc0: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
2cd0: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
2ce0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
2cf0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2d00: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
2d10: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
2d20: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
2d30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d40: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
2d50: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
2d60: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
2d70: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
2d80: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
2d90: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
2da0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2db0: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
2dc0: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
2dd0: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
2de0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
2df0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2e00: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2e10: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
2e20: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
2e30: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
2e40: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
2e50: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
2e60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e70: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
2e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2e90: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
2ea0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
2eb0: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
2ec0: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
2ed0: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
2ee0: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
2ef0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2f00: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
2f10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2f20: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
2f30: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
2f40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
2f50: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2f60: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
2f70: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
2f80: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
2f90: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2fa0: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
2fb0: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
2fc0: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
2fd0: 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66  d..**.** dbModif
2fe0: 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ied.**.**   The 
2ff0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
3000: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3010: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3020: 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20  is dirtied..**  
3030: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61   It is cleared a
3040: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
3050: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  h transaction..*
3060: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65  *.**   It is use
3070: 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  d when committin
3080: 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65  g or otherwise e
3090: 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  nding a transact
30a0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65  ion. If.**   the
30b0: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
30c0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c   is clear then l
30d0: 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20  ess work has to 
30e0: 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a  be done..**.** j
30f0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a  ournalStarted.**
3100: 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20  .**   This flag 
3110: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3120: 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  the the main jou
3130: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61  rnal is opened a
3140: 6e 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69  nd.**   initiali
3150: 7a 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  zed.**.**   The 
3160: 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c  point of this fl
3170: 61 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75  ag is that it mu
3180: 73 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20  st be set after 
3190: 74 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20  the .**   first 
31a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
31b0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
31c0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
31d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41   to disk..**   A
31e0: 66 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61  fter this has ha
31f0: 70 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65  ppened, new page
3200: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
3210: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20  e database .**  
3220: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65   do not need the
3230: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
3240: 20 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68   flag set, as th
3250: 65 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a  ey do not need.*
3260: 2a 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20  *   to wait for 
3270: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62  a journal sync b
3280: 65 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62  efore they can b
3290: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
32a0: 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61  .**   the databa
32b0: 73 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e  se file (see fun
32c0: 63 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74  ction pager_writ
32d0: 65 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73  e())..**   .** s
32e0: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
32f0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
3300: 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
3310: 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72   that the master
3320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
3330: 6d 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29  me.**   (if any)
3340: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
3350: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
3360: 6c 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a  l file once..**.
3370: 2a 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74  **   When commit
3380: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
3390: 6f 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  on, the master j
33a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
33b0: 20 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d   (if any).**   m
33c0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ay be written in
33d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
33e0: 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61  ile while the pa
33f0: 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a  ger is still in.
3400: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
3410: 56 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43  VED state (see C
3420: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
3430: 66 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e  for the action).
3440: 20 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74   It.**   then at
3450: 74 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64  tempts to upgrad
3460: 65 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  e to an exclusiv
3470: 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20  e lock. If this 
3480: 61 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69  attempt.**   fai
3490: 6c 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ls, then SQLITE_
34a0: 42 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75  BUSY may be retu
34b0: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
34c0: 20 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a   and the user.**
34d0: 20 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74     may attempt t
34e0: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
34f0: 6e 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c  nsaction again l
3500: 61 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a  ater (calling.**
3510: 20 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e     CommitPhaseOn
3520: 65 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73  e() again). This
3530: 20 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f   flag is used to
3540: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
3550: 20 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f   .**   master jo
3560: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e  urnal name is on
3570: 6c 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ly written to th
3580: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
3590: 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69  he first.**   ti
35a0: 6d 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  me CommitPhaseOn
35b0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
35c0: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a  *.** doNotSync.*
35d0: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
35e0: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
35f0: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3600: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
3610: 20 66 69 6c 65 20 63 61 6e 6e 6f 74 0a 2a 2a 20   file cannot.** 
3620: 20 20 62 65 20 73 79 6e 63 65 64 2e 20 20 54 68    be synced.  Th
3630: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  is variable is s
3640: 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62  et and cleared b
3650: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
3660: 69 74 65 28 29 20 0a 2a 2a 20 20 20 69 6e 20 6f  ite() .**   in o
3670: 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74 20  rder to prevent 
3680: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 66  a journal sync f
3690: 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e  rom happening in
36a0: 20 62 65 74 77 65 65 6e 20 74 68 65 0a 2a 2a 20   between the.** 
36b0: 20 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 6f 66    journalling of
36c0: 20 74 77 6f 20 70 61 67 65 73 20 6f 6e 20 74 68   two pages on th
36d0: 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 2a  e same sector..*
36e0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
36f0: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
3700: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
3710: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
3720: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
3730: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
3740: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
3750: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
3760: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
3770: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
3780: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
3790: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
37a0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73  ournal"..**.** s
37b0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
37c0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
37d0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
37e0: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
37f0: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
3800: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
3810: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
3820: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
3830: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
3840: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
3850: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
3860: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
3870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3880: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63   files..*/.struc
3890: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
38a0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
38b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
38c0: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
38d0: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
38e0: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
38f0: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
3900: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
3910: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
3920: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
3930: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
3940: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
3950: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
3960: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
3970: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3990: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
39a0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
39b0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
39c0: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
39d0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
39e0: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
39f0: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
3a00: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
3a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
3a20: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
3a30: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
3a40: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a60: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
3a70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3a80: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
3a90: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
3aa0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
3ab0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
3ac0: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
3ad0: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
3ae0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
3af0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
3b00: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
3b10: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
3b20: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
3b30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
3b40: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
3b50: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
3b60: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3b80: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
3b90: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
3ba0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
3bb0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
3bc0: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
3bd0: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
3be0: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
3bf0: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
3c00: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
3c10: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
3c20: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
3c30: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
3c40: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
3c50: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
3c60: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
3c70: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
3c80: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
3c90: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
3ca0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
3cb0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
3cc0: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
3cd0: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
3ce0: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
3cf0: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
3d00: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
3d10: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
3d20: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
3d30: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
3d40: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
3d50: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
3d60: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
3d70: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
3d80: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
3d90: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
3da0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
3db0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
3dc0: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
3dd0: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
3de0: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
3e00: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
3e10: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
3e20: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
3e30: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
3e40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e50: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
3e60: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
3e70: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
3e80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3e90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
3ea0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
3eb0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
3ec0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
3ed0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
3ee0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
3ef0: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
3f00: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
3f10: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
3f20: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
3f30: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
3f40: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
3f50: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
3f60: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
3f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f80: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
3f90: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
3fa0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
3fb0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3fc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3fd0: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3fe0: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3ff0: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
4000: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
4010: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
4020: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
4030: 72 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75  rrect */.  u8 su
4040: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
4050: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
4060: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
4070: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
4080: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40a0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
40b0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
40c0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
40d0: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
40e0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
40f0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
4100: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
4110: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
4120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4130: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
4140: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
4150: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ile */.  int err
4160: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
4170: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
4180: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
4190: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
41a0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
41b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
41c0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
41d0: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
41e0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
41f0: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
4200: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
4210: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
4220: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
4230: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
4240: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
4250: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4260: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
4270: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
4280: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
4290: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
42a0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
42b0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
42c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
42d0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
42e0: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
42f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
4300: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
4310: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
4320: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
4330: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
4340: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
4350: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
4360: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
4370: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
4380: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4390: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
43a0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
43b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
43c0: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
43d0: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
43e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
43f0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
4400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
4410: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
4420: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
4430: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  ader */.  i64 jo
4440: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
4450: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
4460: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
4470: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
4480: 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70   */.  PagerSavep
4490: 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74  oint *aSavepoint
44a0: 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63  ; /* Array of ac
44b0: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
44c0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f  */.  int nSavepo
44d0: 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
44e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
44f0: 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70  ements in aSavep
4500: 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72  oint[] */.  char
4510: 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b   dbFileVers[16];
4520: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
4530: 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61  es whenever data
4540: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
4550: 73 20 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f  s */.  u32 secto
4560: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
4570: 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65     /* Assumed se
4580: 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67  ctor size during
4590: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
45a0: 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20  u16 nExtra;     
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
45c0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
45d0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
45e0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
45f0: 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  16 nReserve;    
4600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4610: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
4620: 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65  ytes at end of e
4630: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33  ach page */.  u3
4640: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
4650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
4660: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
4670: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
4680: 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20  int pageSize;   
4690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
46a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
46b0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  n a page */.  Pg
46c0: 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20  no mxPgno;      
46d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
46e0: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a  imum allowed siz
46f0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
4700: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
4710: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
4720: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
4740: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
4750: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
4760: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4780: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
4790: 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a  dler)(void*); /*
47a0: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   Function to cal
47b0: 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20  l when busy */. 
47c0: 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
47d0: 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20  lerArg;      /* 
47e0: 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74  Context argument
47f0: 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65   for xBusyHandle
4800: 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  r */.#ifdef SQLI
4810: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48  TE_TEST.  int nH
4820: 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20  it, nMiss;      
4830: 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68        /* Cache h
4840: 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20  its and missing 
4850: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20  */.  int nRead, 
4860: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
4870: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
4880: 65 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  es read/written 
4890: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64  */.#endif.  void
48a0: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62   (*xReiniter)(Db
48b0: 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20  Page*); /* Call 
48c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
48d0: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
48e0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
48f0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
4900: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
4910: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
4920: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
4930: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
4940: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
4950: 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  (*xCodecSizeChng
4960: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29  )(void*,int,int)
4970: 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70  ; /* Notify of p
4980: 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73  age size changes
4990: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
49a0: 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b  decFree)(void*);
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49c0: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  Destructor for t
49d0: 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f  he codec */.  vo
49e0: 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20  id *pCodec;     
49f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4a00: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
4a10: 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73  Codec... methods
4a20: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
4a30: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
4a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
4a50: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
4a60: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
4a70: 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68  p use */.  PCach
4a80: 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20  e *pPCache;     
4a90: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
4aa0: 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20  r to page cache 
4ab0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
4ac0: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
4ad0: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
4ae0: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
4af0: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
4b00: 63 65 73 73 65 73 20 2a 2f 0a 23 69 66 6e 64 65  cesses */.#ifnde
4b10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
4b20: 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20  L.  Wal *pWal;  
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c  /* Write-ahead l
4b50: 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72  og used by "jour
4b60: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f  nal_mode=wal" */
4b70: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
4b80: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4b90: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
4ba0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
4bb0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
4bc0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
4bd0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
4be0: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
4bf0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
4c00: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
4c10: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
4c20: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
4c30: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4c40: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
4c50: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
4c60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
4c70: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
4c80: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
4c90: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4ca0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
4cb0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
4cc0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4cd0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
4ce0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4cf0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
4d00: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4d10: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
4d20: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
4d30: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
4d40: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
4d50: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
4d60: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
4d70: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
4d80: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
4d90: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
4da0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
4db0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
4dc0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
4dd0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
4de0: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
4df0: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
4e00: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
4e10: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
4e20: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
4e30: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
4e40: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
4e50: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
4e60: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
4e70: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
4e80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
4e90: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
4ea0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
4eb0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
4ec0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
4ed0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
4ee0: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
4ef0: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
4f00: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
4f10: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
4f20: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
4f30: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
4f40: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
4f50: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
4f60: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
4f70: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
4f80: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
4f90: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
4fa0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
4fb0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
4fc0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
4fd0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
4fe0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
4ff0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
5000: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
5010: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
5020: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
5030: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
5040: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
5050: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
5060: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
5070: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
5080: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
5090: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
50a0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
50b0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
50c0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
50d0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
50e0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
50f0: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
5100: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
5110: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
5120: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
5130: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
5140: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
5150: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
5160: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
5170: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
5180: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
5190: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
51a0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
51b0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
51c0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
51d0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
51e0: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
51f0: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
5200: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
5210: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
5220: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
5230: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
5240: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
5250: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
5260: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
5270: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
5280: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
5290: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
52a0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
52b0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
52c0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
52d0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
52e0: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
52f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
5300: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
5310: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
5320: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
5330: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
5340: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
5350: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
5360: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
5370: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
5380: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
5390: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
53a0: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
53b0: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
53c0: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
53d0: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
53e0: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
53f0: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
5400: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
5410: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
5420: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5430: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
5440: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
5450: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
5460: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
5470: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
5480: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5490: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
54a0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
54b0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
54c0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
54d0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
54e0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
54f0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
5500: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
5510: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
5520: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
5530: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
5540: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
5550: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5560: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
5570: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
5580: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
5590: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
55a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
55b0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
55c0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
55d0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
55e0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
55f0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
5600: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
5610: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  /*.** Usage:.**.
5620: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73  **   assert( ass
5630: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
5640: 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74  pPager) );.*/.st
5650: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
5660: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
5670: 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f  r *pPager){..  /
5680: 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69 73  * A temp-file is
5690: 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45 52   always in PAGER
56a0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50 41  _EXCLUSIVE or PA
56b0: 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65  GER_SYNCED state
56c0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
56d0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
56e0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  =0 || pPager->st
56f0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
5700: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  SIVE );..  /* Th
5710: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
5720: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
5730: 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66 69   set for temp-fi
5740: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
5750: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
5760: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
5770: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
5780: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
5790: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
57a0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
57b0: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
57c0: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
57d0: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
57e0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
57f0: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
5800: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
5810: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
5820: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
5830: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
5840: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
5850: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
5860: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
5870: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
5880: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
5890: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
58a0: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
58b0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
58c0: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
58d0: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
58e0: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
58f0: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
5900: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
5910: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
5920: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
5930: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
5940: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  g->pgno;.  Pager
5950: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
5960: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b  pPager;.  int i;
5970: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
5980: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
5990: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65  ; i++){.    Page
59a0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
59b0: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
59c0: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
59d0: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
59e0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
59f0: 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76  ecTest(p->pInSav
5a00: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
5a10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
5a20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5a30: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5a40: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
5a50: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
5a60: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
5a70: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
5a80: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
5a90: 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b  nal(PgHdr *pPg){
5aa0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5ab0: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d  3BitvecTest(pPg-
5ac0: 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  >pPager->pInJour
5ad0: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
5ae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
5af0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
5b00: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
5b10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
5b20: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
5b30: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
5b40: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
5b50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
5b60: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
5b70: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
5b80: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
5b90: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
5ba0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
5bb0: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
5bc0: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
5bd0: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
5be0: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
5bf0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
5c00: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
5c10: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
5c20: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
5c30: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
5c40: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
5c50: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
5c60: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
5c70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5c80: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
5c90: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
5ca0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5cb0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
5cc0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
5cd0: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
5ce0: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
5cf0: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
5d00: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
5d10: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
5d20: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
5d30: 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  )../*.** Write a
5d40: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
5d50: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
5d60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
5d70: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5d80: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
5d90: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
5da0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
5db0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
5dc0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
5dd0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
5de0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
5df0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
5e00: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
5e10: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
5e20: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5e30: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
5e40: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
5e50: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
5e60: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
5e70: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
5e80: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
5e90: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
5ea0: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
5eb0: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
5ec0: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
5ed0: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
5ee0: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
5ef0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
5f00: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
5f10: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
5f20: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
5f30: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
5f40: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
5f50: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
5f60: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
5f70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
5f80: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
5f90: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
5fa0: 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73  * If file pFd is
5fb0: 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69   open, call sqli
5fc0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e  te3OsUnlock() on
5fd0: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
5fe0: 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt osUnlock(sqli
5ff0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
6000: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
6010: 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29 7b   !isOpen(pFd) ){
6020: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6030: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
6040: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
6050: 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b  ock(pFd, eLock);
6060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
6070: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
6080: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
6090: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
60a0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
60b0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
60c0: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
60d0: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
60e0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
60f0: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
6100: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
6110: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
6120: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
6130: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
6140: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
6150: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
6160: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
6170: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
6180: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
6190: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
61a0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
61b0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
61c0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
61d0: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
61e0: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
61f0: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
6200: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
6210: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
6220: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
6230: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
6240: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
6250: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
6260: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
6270: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
6280: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
6290: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
62a0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
62b0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
62c0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
62d0: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
62e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
62f0: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
6300: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
6310: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
6320: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
6330: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6340: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
6350: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
6360: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
6370: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
6380: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
6390: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
63a0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
63b0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
63d0: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
63e0: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
63f0: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
6420: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
6430: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
6440: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
6450: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
6460: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
6470: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
6480: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
6490: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
64a0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
64b0: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
64c0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
64d0: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
64e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
64f0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
6500: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
6510: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
6520: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
6530: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
6540: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
6550: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
6560: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
6570: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
6580: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
6590: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
65a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
65b0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
65c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
65d0: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
65e0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
65f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
6600: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
6610: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
6620: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
6630: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
6640: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
6650: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
6660: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
6670: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
6680: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
6690: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
66a0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
66b0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
66c0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
66d0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
66e0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
66f0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
6700: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
6710: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6720: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
6730: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
6740: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
6750: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
6760: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
6770: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
6780: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
6790: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
67a0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
67b0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
67c0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
67d0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
67e0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
67f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
6800: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
6810: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
6820: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
6830: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
6840: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
6850: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
6860: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
6870: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
6880: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
6890: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
68a0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
68b0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
68c0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
68d0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
68e0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
68f0: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
6900: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
6910: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
6920: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
6930: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
6940: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
6950: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
6960: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
6970: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
6980: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
6990: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
69a0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
69b0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
69c0: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
69d0: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
69e0: 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  e.      || (pPg-
69f0: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
6a00: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
6a10: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
6a20: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
6a30: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
6a40: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
6a50: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
6a60: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
6a70: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
6a80: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
6a90: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
6aa0: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
6ab0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
6ac0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
6ad0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
6ae0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
6af0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
6b00: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
6b10: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
6b20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6b30: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
6b40: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
6b50: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
6b60: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
6b70: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
6b80: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
6b90: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
6ba0: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
6bb0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
6bc0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
6bd0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
6be0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
6bf0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
6c00: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
6c10: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
6c20: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
6c30: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
6c40: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
6c50: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
6c60: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
6c70: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
6c80: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
6c90: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
6ca0: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
6cb0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
6cc0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
6cd0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
6ce0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
6cf0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
6d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
6d10: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
6d20: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
6d30: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
6d40: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
6d50: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
6d60: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
6d70: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
6d80: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
6d90: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
6da0: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
6db0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6dc0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
6dd0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
6de0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
6df0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
6e00: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
6e10: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
6e20: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
6e30: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
6e40: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
6e50: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
6e60: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
6e70: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
6e80: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
6e90: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
6ea0: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
6eb0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6ec0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
6ed0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
6ee0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
6ef0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
6f00: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
6f10: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
6f20: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
6f30: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
6f40: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
6f50: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6f70: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
6f80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
6f90: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
6fa0: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
6fb0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fd0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
6fe0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7000: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
7010: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
7020: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
7030: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
7040: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
7050: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
7060: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
7070: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
7080: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
7090: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
70a0: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
70b0: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
70c0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
70e0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
70f0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
7100: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
7110: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
7120: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
7130: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
7140: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
7150: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
7160: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
7170: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
7180: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
7190: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
71a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
71b0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
71c0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
71d0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
71e0: 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  er .   || SQLITE
71f0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
7200: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
7210: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
7220: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
7230: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
7240: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
7250: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
7260: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
7270: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7280: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
7290: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
72a0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
72b0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
72c0: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
72d0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
72e0: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
72f0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
7300: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
7310: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
7320: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
7330: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
7340: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
7350: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
7360: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
7370: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
7380: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
7390: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
73a0: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
73b0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
73c0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
73d0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
73e0: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
73f0: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
7400: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
7410: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
7420: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
7430: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
7440: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
7450: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
7460: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
7470: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
7480: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
7490: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
74a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
74b0: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
74c0: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
74d0: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
74e0: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
74f0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
7500: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
7510: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
7520: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
7530: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
7540: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
7550: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
7560: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
7570: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
7580: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
7590: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
75a0: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75d0: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7610: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
7640: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
7650: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
7660: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
7670: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
7680: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7690: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
76a0: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
76b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
76c0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
76d0: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
76e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
76f0: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
7700: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7710: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
7720: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
7730: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7740: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
7750: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
7760: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
7770: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
7780: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
7790: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
77a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
77b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
77c0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
77d0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
77e0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
77f0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
7800: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
7810: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
7820: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
7830: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
7840: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
7850: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
7860: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
7870: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
7880: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
7890: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
78a0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
78b0: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
78c0: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
78d0: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
78e0: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
78f0: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
7900: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
7910: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
7920: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
7930: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7940: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
7950: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
7960: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
7970: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
7980: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
7990: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
79a0: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
79b0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
79c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
79d0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
79e0: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
79f0: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
7a00: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
7a10: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
7a20: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
7a30: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
7a40: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
7a50: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
7a60: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
7a70: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
7a80: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
7a90: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
7aa0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
7ab0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
7ac0: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
7ad0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
7ae0: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
7af0: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
7b00: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
7b10: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
7b20: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
7b30: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
7b40: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
7b50: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
7b60: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
7b70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7b80: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
7b90: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
7ba0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
7bb0: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
7bc0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7bd0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
7c00: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
7c10: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
7c20: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
7c30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
7c40: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
7c50: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
7c60: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
7c70: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
7c80: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
7c90: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
7ca0: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
7cb0: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
7cc0: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
7cd0: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
7ce0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
7cf0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
7d00: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
7d10: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
7d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
7d30: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
7d40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7d50: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
7d60: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
7d70: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
7d80: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
7d90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7da0: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
7db0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
7dc0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
7dd0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
7de0: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
7df0: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
7e00: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
7e10: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
7e20: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
7e30: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
7e40: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
7e50: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
7e60: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
7e70: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
7e80: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
7e90: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
7ea0: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
7eb0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
7ec0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7ed0: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
7ee0: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
7ef0: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
7f00: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
7f10: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
7f20: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
7f30: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
7f40: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
7f50: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
7f60: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
7f70: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7f80: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
7f90: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
7fa0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7fb0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
7fc0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
7fd0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
7fe0: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
7ff0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
8000: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
8010: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
8020: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
8030: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8040: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8050: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8060: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
8070: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
8080: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
8090: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
80a0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
80b0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
80c0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
80d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
80e0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
80f0: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
8100: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
8110: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8120: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
8130: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
8140: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
8150: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
8160: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
8170: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
8180: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
8190: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
81a0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
81b0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
81c0: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
81d0: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
81e0: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
81f0: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
8200: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
8210: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
8220: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
8230: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
8240: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
8250: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
8260: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
8270: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
8280: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
8290: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
82a0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
82b0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
82c0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
82d0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
82e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8300: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
8310: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
8320: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
8330: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
8340: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
8350: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
8360: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
8370: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8380: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
8390: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
83a0: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
83b0: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
83e0: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
83f0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
8400: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8430: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
8440: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
8450: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
8460: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
8470: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
8480: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
8490: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
84a0: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
84b0: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
84c0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
84d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
84e0: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
84f0: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
8500: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
8510: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
8520: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
8530: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
8540: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
8550: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
8560: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
8570: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
8580: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
8590: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
85a0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
85b0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
85c0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
85d0: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
85e0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
85f0: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
8600: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
8610: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
8620: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
8630: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
8640: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8650: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
8660: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
8670: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
8680: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
8690: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
86a0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
86b0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
86c0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
86d0: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
86e0: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
86f0: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
8700: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
8710: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
8720: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
8730: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
8740: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
8750: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
8760: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
8770: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
8780: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
8790: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
87a0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
87b0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
87c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
87d0: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
87e0: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
87f0: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
8800: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
8810: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
8820: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
8830: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
8840: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
8850: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
8860: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8870: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
8880: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
8890: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
88a0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
88b0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
88c0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
88d0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
88e0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
88f0: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
8900: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
8910: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
8920: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
8930: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
8940: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
8950: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
8960: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
8970: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
8980: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
8990: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
89a0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
89b0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
89c0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
89d0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
89e0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
89f0: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
8a00: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
8a10: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
8a20: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
8a30: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
8a40: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
8a50: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
8a60: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
8a70: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
8a80: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
8a90: 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( (pPager->noSyn
8aa0: 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  c) || (pPager->j
8ab0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
8ac0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
8ad0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
8ae0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
8af0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
8b00: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
8b10: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
8b20: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
8b30: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
8b40: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
8b50: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8b60: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
8b70: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
8b80: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
8b90: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
8ba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
8bb0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
8bc0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8bd0: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
8be0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
8bf0: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
8c00: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
8c10: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
8c20: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
8c30: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
8c40: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
8c50: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8c60: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8c70: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
8c80: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
8c90: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
8ca0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
8cb0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
8cc0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
8cd0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
8ce0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
8cf0: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
8d00: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
8d10: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
8d20: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
8d30: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
8d40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8d50: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
8d60: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
8d70: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
8d80: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
8d90: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
8da0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
8db0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
8dc0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
8dd0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
8de0: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
8df0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
8e00: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
8e10: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
8e20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8e30: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
8e40: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
8e50: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
8e60: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
8e70: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
8e80: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
8e90: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
8ea0: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
8eb0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
8ec0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
8ed0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8ee0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
8ef0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
8f00: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
8f10: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
8f20: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
8f30: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
8f40: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
8f50: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
8f60: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
8f70: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
8f80: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
8f90: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
8fa0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
8fb0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
8fc0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
8fd0: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
8fe0: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
8ff0: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
9000: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
9010: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
9020: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
9030: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
9040: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
9050: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
9060: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
9070: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
9080: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
9090: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
90a0: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
90b0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
90c0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
90d0: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
90e0: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
90f0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
9100: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
9110: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
9120: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
9130: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
9140: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
9150: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
9160: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
9170: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
9180: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
9190: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
91a0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
91b0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
91c0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
91d0: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
91e0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
91f0: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
9200: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
9210: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
9220: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
9230: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
9240: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
9250: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
9260: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
9270: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
9280: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
9290: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
92a0: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
92b0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
92c0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
92d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
92e0: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
92f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
9300: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
9310: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
9320: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
9330: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
9340: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
9350: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
9360: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
9370: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
9380: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
9390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
93a0: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
93b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
93c0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
93d0: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
93e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
93f0: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
9400: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
9410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
9420: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9430: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
9440: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
9450: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
9460: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
9470: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
9480: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
9490: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
94a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
94b0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
94c0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
94d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
94e0: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
94f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9500: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
9510: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
9520: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
9530: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
9540: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
9550: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
9560: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
9570: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
9580: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
9590: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
95a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
95b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
95c0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
95d0: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
95e0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
95f0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
9600: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
9610: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
9620: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
9630: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
9640: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
9650: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
9660: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
9670: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
9680: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
9690: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
96a0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
96b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
96c0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
96d0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
96e0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
96f0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
9700: 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
9710: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
9720: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
9730: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
9740: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
9750: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9760: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
9770: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
9780: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
9790: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
97a0: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
97b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
97c0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
97d0: 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
97e0: 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
97f0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
9800: 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
9810: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
9820: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
9830: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9840: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
9850: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
9860: 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
9870: 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
9880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9890: 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
98a0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
98b0: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
98c0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98e0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
98f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9900: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
9910: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
9920: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
9930: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
9940: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
9950: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9960: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
9970: 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
9980: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
9990: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
99a0: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
99b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
99c0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
99d0: 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
99e0: 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
99f0: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
9a00: 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
9a10: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
9a20: 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
9a30: 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
9a40: 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
9a50: 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
9a60: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
9a70: 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
9a80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9a90: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
9aa0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
9ab0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
9ac0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
9ad0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
9ae0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
9af0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9b00: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
9b10: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
9b20: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
9b30: 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
9b40: 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
9b50: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
9b60: 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
9b70: 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
9b80: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
9b90: 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
9ba0: 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
9bb0: 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
9bc0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
9bd0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
9be0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
9bf0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
9c00: 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
9c10: 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
9c20: 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
9c30: 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
9c40: 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
9c50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
9c60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
9c70: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
9c80: 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
9c90: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
9ca0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9cb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
9cc0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
9cd0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
9ce0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
9cf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9d00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
9d10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
9d20: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
9d30: 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
9d40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9d50: 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
9d60: 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
9d70: 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
9d80: 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
9d90: 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
9da0: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
9db0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
9dc0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
9dd0: 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
9de0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
9df0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
9e00: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
9e10: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9e20: 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
9e30: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
9e40: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
9e50: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9e60: 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
9e70: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9e80: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
9e90: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
9ea0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9eb0: 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
9ec0: 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
9ed0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
9ee0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
9ef0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
9f00: 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
9f10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9f20: 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
9f30: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
9f40: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
9f50: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
9f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
9f70: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
9f80: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
9f90: 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50 61 67   */.    u16 iPag
9fa0: 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20 20 20  eSize16;        
9fb0: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
9fc0: 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31 36 2d  iPageSize in 16-
9fd0: 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  bit variable */.
9fe0: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
9ff0: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
a000: 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e  ector-size journ
a010: 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73  al header fields
a020: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  . */.    if( SQL
a030: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
a040: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
a050: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30  >jfd, iHdrOff+20
a060: 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29  , &iSectorSize))
a070: 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
a080: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
a090: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a0a0: 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69  , iHdrOff+24, &i
a0b0: 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29  PageSize)).    )
a0c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
a0d0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
a0e0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
a0f0: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
a100: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
a110: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
a120: 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
a130: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
a140: 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
a150: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
a160: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
a170: 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
a180: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
a190: 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
a1a0: 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
a1b0: 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
a1c0: 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
a1d0: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
a1e0: 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
a1f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
a200: 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
a210: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
a220: 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
a230: 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
a240: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a250: 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
a260: 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
a270: 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
a280: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
a290: 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
a2a0: 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
a2b0: 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
a2c0: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
a2d0: 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
a2e0: 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
a2f0: 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
a300: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
a310: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
a320: 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
a330: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
a340: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
a350: 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
a360: 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
a370: 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
a380: 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
a390: 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
a3a0: 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
a3b0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
a3c0: 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
a3d0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
a3e0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
a3f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
a400: 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
a410: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
a420: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
a430: 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
a440: 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
a450: 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
a460: 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
a470: 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
a480: 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
a490: 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
a4a0: 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
a4b0: 20 20 69 50 61 67 65 53 69 7a 65 31 36 20 3d 20    iPageSize16 = 
a4c0: 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a  (u16)iPageSize;.
a4d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a4e0: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
a4f0: 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
a500: 69 7a 65 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20  ize16, -1);.    
a510: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
a520: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61  LITE_OK );.    a
a530: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
a540: 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a  E_OK || iPageSiz
a550: 65 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65 53  e16==(u16)iPageS
a560: 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  ize );..    /* U
a570: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
a580: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
a590: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
a5a0: 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
a5b0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
a5c0: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
a5d0: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
a5e0: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
a5f0: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
a600: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
a610: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
a620: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
a630: 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
a640: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
a650: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
a660: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
a670: 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
a680: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
a690: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
a6a0: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
a6b0: 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
a6c0: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
a6d0: 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
a6e0: 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
a6f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
a700: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
a710: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
a720: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
a730: 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
a740: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
a750: 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
a760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
a770: 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
a780: 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
a790: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
a7a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
a7b0: 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
a7c0: 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
a7d0: 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
a7e0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
a7f0: 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
a800: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
a810: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
a820: 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
a830: 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
a840: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
a850: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
a860: 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
a870: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
a880: 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
a890: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
a8a0: 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
a8b0: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
a8c0: 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
a8d0: 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
a8e0: 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
a8f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a900: 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
a910: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
a920: 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
a930: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
a940: 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
a950: 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
a960: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
a970: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
a980: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
a990: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
a9a0: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
a9b0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
a9c0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
a9d0: 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
a9e0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
a9f0: 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
aa00: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
aa10: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
aa20: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
aa30: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
aa40: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
aa50: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
aa60: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
aa70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aa80: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
aa90: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
aaa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
aab0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
aac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
aae0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
aaf0: 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
ab20: 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
ab30: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
ab60: 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
ab70: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
ab80: 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
aba0: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
abb0: 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
abc0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abe0: 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
abf0: 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
ac00: 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  */..  if( !zMast
ac10: 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65  er || pPager->se
ac20: 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c 20 70 50  tMaster.   || pP
ac30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ac40: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ac50: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
ac60: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
ac70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ac80: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
ac90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
aca0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
acb0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
acc0: 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
acd0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
ace0: 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  jfd) );.  assert
acf0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
ad00: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
ad10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20  journalOff );.. 
ad20: 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
ad30: 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  e length in byte
ad40: 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73  s and the checks
ad50: 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f  um of zMaster */
ad60: 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30  .  for(nMaster=0
ad70: 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  ; zMaster[nMaste
ad80: 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a  r]; nMaster++){.
ad90: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
ada0: 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20  ster[nMaster];. 
adb0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
adc0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
add0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
ade0: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
adf0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
ae00: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
ae10: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
ae20: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
ae30: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
ae40: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
ae50: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
ae60: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
ae70: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
ae80: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
ae90: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
aea0: 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
aeb0: 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
aec0: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  er);.  }.  iHdrO
aed0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
aee0: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
aef0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
af00: 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20  journal data to 
af10: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
af20: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a  ournal file. If.
af30: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
af40: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65  curs, return the
af50: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
af60: 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a  he caller..  */.
af70: 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20    if( (0 != (rc 
af80: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
af90: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
afa0: 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
afb0: 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20  O(pPager)))).   
afc0: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
afd0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
afe0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
aff0: 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64  er, nMaster, iHd
b000: 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20  rOff+4))).   || 
b010: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
b020: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
b030: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
b040: 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
b050: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
b060: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
b070: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
b080: 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
b090: 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c  4, cksum))).   |
b0a0: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
b0b0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
b0c0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
b0d0: 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72  alMagic, 8, iHdr
b0e0: 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29  Off+4+nMaster+8)
b0f0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
b100: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
b110: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
b120: 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b  += (nMaster+20);
b130: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
b140: 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
b150: 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20  oSync;..  /* If 
b160: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
b170: 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
b180: 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
b190: 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
b1a0: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
b1b0: 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
b1c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
b1d0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
b1e0: 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
b1f0: 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
b200: 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
b210: 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
b220: 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
b230: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
b240: 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
b250: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
b260: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
b270: 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
b280: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
b290: 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
b2a0: 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
b2b0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
b2c0: 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
b2d0: 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
b2e0: 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
b2f0: 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
b300: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
b310: 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
b320: 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
b330: 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
b340: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
b350: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
b360: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
b370: 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
b380: 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
b390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b3a0: 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
b3b0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
b3c0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b3d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b3e0: 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
b3f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
b400: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
b410: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
b420: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
b430: 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  er. Return.** a 
b440: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
b450: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  age or NULL if t
b460: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
b470: 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72  e is not .** alr
b480: 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a  eady in memory..
b490: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
b4a0: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
b4b0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
b4c0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
b4d0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4f0: 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
b500: 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
b510: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63  possible for a c
b520: 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74  all to PcacheFet
b530: 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65  ch() with create
b540: 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20  Flag==0 to.  ** 
b550: 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61  fail, since no a
b560: 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
b570: 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  te dynamic memor
b580: 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a  y will be made..
b590: 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c    */.  (void)sql
b5a0: 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
b5b0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
b5c0: 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20   pgno, 0, &p);. 
b5d0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
b5e0: 0a 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70  .** Unless the p
b5f0: 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72  ager is in error
b600: 2d 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20  -state, discard 
b610: 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
b620: 67 65 73 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70  ges. If.** the p
b630: 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72  ager is in error
b640: 2d 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69  -state, then thi
b650: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
b660: 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57  p..**.** TODO: W
b670: 68 79 20 63 61 6e 20 77 65 20 6e 6f 74 20 72 65  hy can we not re
b680: 73 65 74 20 74 68 65 20 70 61 67 65 72 20 77 68  set the pager wh
b690: 69 6c 65 20 69 6e 20 65 72 72 6f 72 20 73 74 61  ile in error sta
b6a0: 74 65 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te?.*/.static vo
b6b0: 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50  id pager_reset(P
b6c0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b6d0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
b6e0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b6f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61  ){.    sqlite3Ba
b700: 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
b710: 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
b720: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
b730: 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
b740: 61 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65  ache);.    pPage
b750: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
b760: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
b770: 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74   Free all struct
b780: 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65  ures in the Page
b790: 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61  r.aSavepoint[] a
b7a0: 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74  rray and set bot
b7b0: 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65  h.** Pager.aSave
b7c0: 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e  point and Pager.
b7d0: 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65  nSavepoint to ze
b7e0: 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75  ro. Close the su
b7f0: 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20  b-journal.** if 
b800: 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  it is open and t
b810: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
b820: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
b830: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
b840: 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65  d releaseAllSave
b850: 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50  points(Pager *pP
b860: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b  ager){.  int ii;
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b880: 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c  * Iterator for l
b890: 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50  ooping through P
b8a0: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
b8b0: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
b8c0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b8d0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
b8e0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
b8f0: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
b900: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
b910: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
b920: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
b930: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
b940: 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
b950: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
b960: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b970: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
b980: 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
b990: 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
b9a0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
b9b0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
b9c0: 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
b9d0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
b9e0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
b9f0: 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
ba00: 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
ba10: 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
ba20: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
ba30: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
ba40: 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
ba50: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
ba60: 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
ba70: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
ba80: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
ba90: 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
baa0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
bab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
bac0: 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
bad0: 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
bae0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
baf0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
bb00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
bb10: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
bb20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bb30: 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
bb40: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
bb50: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
bb60: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
bb70: 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
bb80: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
bb90: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
bba0: 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
bbb0: 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
bbc0: 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
bbd0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
bbe0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bbf0: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
bc00: 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
bc10: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
bc20: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
bc30: 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
bc40: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
bc50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bc60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
bc70: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69  turn true if thi
bc80: 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77  s pager uses a w
bc90: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69  rite-ahead log i
bca0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
bcb0: 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  ual.** rollback 
bcc0: 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69  journal. Otherwi
bcd0: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66  se false..*/.#if
bce0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bcf0: 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20  _WAL.static int 
bd00: 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65  pagerUseWal(Page
bd10: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
bd20: 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57  turn (pPager->pW
bd30: 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a  al!=0);.}.#else.
bd40: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73  # define pagerUs
bd50: 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  eWal(x) 0.# defi
bd60: 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  ne pagerRollback
bd70: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
bd80: 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  e pagerWalFrames
bd90: 28 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 20  (v,w,x,y,z) 0.# 
bda0: 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e  define pagerOpen
bdb0: 57 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20  WalIfPresent(z) 
bdc0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
bdd0: 6e 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  ne pagerBeginRea
bde0: 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20  dTransaction(z) 
bdf0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
be00: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
be10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
be20: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
be30: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
be40: 65 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e  e pager.** is in
be50: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
be60: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
be70: 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
be80: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   in error state,
be90: 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   discard the con
bea0: 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65  tents of .** the
beb0: 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74   cache and reset
bec0: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
bed0: 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74  ture internal st
bee0: 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ate. If there is
bef0: 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72  .** an open jour
bf00: 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74  nal-file, then t
bf10: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73  he next time a s
bf20: 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62  hared-lock is ob
bf30: 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  tained.** on the
bf40: 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20   pager file (by 
bf50: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
bf60: 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77  r process), it w
bf70: 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65  ill be.** treate
bf80: 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
bf90: 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61  al and rolled ba
bfa0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
bfb0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
bfc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bfd0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
bfe0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
bff0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
c000: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
c010: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
c020: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79  */..    /* Alway
c030: 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  s close the jour
c040: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
c050: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
c060: 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a  ase lock..    **
c070: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74   Otherwise, anot
c080: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
c090: 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
c0a0: 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20  =delete might.  
c0b0: 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20    ** delete the 
c0c0: 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e  file out from un
c0d0: 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
c0e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
c0f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
c100: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
c110: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
c120: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
c130: 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
c140: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  rnal = 0;.    re
c150: 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
c160: 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  ts(pPager);..   
c170: 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
c180: 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d  is unlocked, som
c190: 65 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74  ebody else might
c1a0: 20 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a   change it. The.
c1b0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74      ** values st
c1c0: 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62  ored in Pager.db
c1d0: 53 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20  Size etc. might 
c1e0: 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69  become invalid i
c1f0: 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61  f.    ** this ha
c200: 70 70 65 6e 73 2e 20 20 4f 6e 65 20 63 61 6e 20  ppens.  One can 
c210: 61 72 67 75 65 20 74 68 61 74 20 74 68 69 73 20  argue that this 
c220: 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20  doesn't need to 
c230: 62 65 20 63 6c 65 61 72 65 64 0a 20 20 20 20 2a  be cleared.    *
c240: 2a 20 75 6e 74 69 6c 20 74 68 65 20 63 68 61 6e  * until the chan
c250: 67 65 2d 63 6f 75 6e 74 65 72 20 63 68 65 63 6b  ge-counter check
c260: 20 66 61 69 6c 73 20 69 6e 20 50 61 67 65 72 53   fails in PagerS
c270: 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20  haredLock()..   
c280: 20 2a 2a 20 43 6c 65 61 72 69 6e 67 20 74 68 65   ** Clearing the
c290: 20 70 61 67 65 20 73 69 7a 65 20 63 61 63 68 65   page size cache
c2a0: 20 68 65 72 65 20 69 73 20 62 65 69 6e 67 20 63   here is being c
c2b0: 6f 6e 73 65 72 76 61 74 69 76 65 2e 0a 20 20 20  onservative..   
c2c0: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
c2d0: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
c2e0: 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
c2f0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
c300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
c310: 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
c320: 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
c330: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c340: 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63      rc = osUnloc
c350: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
c360: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  _LOCK);.    }.  
c370: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c380: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
c390: 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  e = rc;.    }.  
c3a0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
c3b0: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
c3c0: 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61  ))..    /* If Pa
c3d0: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
c3e0: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
c3f0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
c400: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
c410: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
c420: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
c430: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
c440: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
c450: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
c460: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
c470: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
c480: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
c490: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
c4a0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
c4b0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
c4c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c4d0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
c4e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
c4f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
c500: 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  }.      pager_re
c510: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
c520: 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
c530: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
c540: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
c550: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
c560: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65  NLOCK;.    pPage
c570: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
c580: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
c590: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
c5a0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
c5b0: 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f  hen an IOERR, CO
c5c0: 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72  RRUPT or FULL er
c5d0: 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20  ror.** may have 
c5e0: 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69  occurred. The fi
c5f0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
c600: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c610: 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63   pager .** struc
c620: 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
c630: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
c640: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
c650: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
c660: 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  .** API function
c670: 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
c680: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
c690: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
c6a0: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69  ument .** to thi
c6b0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
c6c0: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
c6d0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
c6e0: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
c6f0: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
c700: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
c710: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
c720: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
c730: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65   the persisten e
c740: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
c750: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
c760: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
c770: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
c780: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
c790: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
c7a0: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
c7b0: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
c7c0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
c7d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
c7e0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
c7f0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
c800: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
c810: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
c820: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
c830: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
c840: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
c850: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
c860: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
c870: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
c880: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
c890: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  t error occurred
c8a0: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
c8b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  ack journal may 
c8c0: 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65  need.** to be re
c8d0: 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72  played to restor
c8e0: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
c8f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
c900: 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74  ile (as if.** it
c910: 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72   were a hot-jour
c920: 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nal)..*/.static 
c930: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
c940: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
c950: 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
c960: 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
c970: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
c980: 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
c990: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20   );.  assert(.  
c9a0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
c9b0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
c9c0: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
c9d0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
c9e0: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
c9f0: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
ca00: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
ca10: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
ca20: 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46  f( rc2==SQLITE_F
ca30: 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49  ULL || rc2==SQLI
ca40: 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
ca50: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
ca60: 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = rc;.  }.  retu
ca70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ca80: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
ca90: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
caa0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
cab0: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
cac0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
cad0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
cae0: 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
caf0: 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
cb00: 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  r state, do not 
cb10: 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
cb20: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
cb30: 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
cb40: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
cb50: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
cb60: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
cb70: 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
cb80: 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
cb90: 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
cba0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
cbb0: 20 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20   file and clear 
cbc0: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
cbd0: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
cbe0: 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  hat.** there is 
cbf0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
cc00: 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
cc10: 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
cc20: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f  connection.** to
cc30: 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
cc40: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
cc50: 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
cc60: 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a   this one) will.
cc70: 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ** roll it back.
cc80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
cc90: 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
cca0: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
ccb0: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74  error state, but
ccc0: 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
ccd0: 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
cce0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
ccf0: 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
cd00: 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
cd10: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
cd20: 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
cd30: 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
cd40: 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
cd50: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
cd60: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
cd70: 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
cd80: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
cd90: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
cda0: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
cdb0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
cdc0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
cdd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
cde0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
cdf0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
ce00: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
ce10: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
ce20: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
ce30: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
ce40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
ce50: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
ce60: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
ce70: 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
ce80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ce90: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
cea0: 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
ceb0: 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
cec0: 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
ced0: 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
cee0: 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
cef0: 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
cf00: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
cf10: 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
cf20: 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
cf30: 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
cf40: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
cf50: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
cf60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
cf70: 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
cf80: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
cf90: 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
cfa0: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
cfb0: 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  n..** .** If the
cfc0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
cfd0: 45 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47  ER_SHARED or PAG
cfe0: 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
cff0: 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  when this.** rou
d000: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
d010: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72  it is a no-op (r
d020: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
d030: 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
d040: 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73  se, any active s
d050: 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65  avepoints are re
d060: 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leased..**.** If
d070: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d080: 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
d090: 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64  it is "finalized
d0a0: 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61  ". Once a journa
d0b0: 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62  l .** file has b
d0c0: 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74  een finalized it
d0d0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
d0e0: 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f   to use it to ro
d0f0: 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72  ll back a .** tr
d100: 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77  ansaction. Nor w
d110: 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64  ill it be consid
d120: 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74  ered to be a hot
d130: 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73  -journal by this
d140: 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  .** or any other
d150: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d160: 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f  tion. Exactly ho
d170: 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  w a journal is f
d180: 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65  inalized.** depe
d190: 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
d1a0: 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20  r not the pager 
d1b0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
d1c0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
d1d0: 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
d1e0: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61  journal-mode (Pa
d1f0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
d200: 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f  value), as follo
d210: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ws:.**.**   jour
d220: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a  nalMode==MEMORY.
d230: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
d240: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
d250: 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e  s simply closed.
d260: 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61   This destroys a
d270: 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d  n .**     in-mem
d280: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ory journal..**.
d290: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
d2a0: 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  ==TRUNCATE.**   
d2b0: 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    Journal file i
d2c0: 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  s truncated to z
d2d0: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
d2e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  e..**.**   journ
d2f0: 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a  alMode==PERSIST.
d300: 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74  **     The first
d310: 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65   28 bytes of the
d320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
d330: 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69  e zeroed. This i
d340: 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20  nvalidates.**   
d350: 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72    the first jour
d360: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
d370: 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63  e file, and henc
d380: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
d390: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
d3a0: 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75  . An invalid jou
d3b0: 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74  rnal file cannot
d3c0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
d3d0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
d3e0: 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20  Mode==DELETE.** 
d3f0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
d400: 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61  file is closed a
d410: 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  nd deleted using
d420: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
d430: 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66  ()..**.**     If
d440: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
d450: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
d460: 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65  ve mode, this me
d470: 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69  thod of finalizi
d480: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  ng.**     the jo
d490: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
d4a0: 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61  ver used. Instea
d4b0: 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  d, if the journa
d4c0: 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20  lMode is.**     
d4d0: 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70  DELETE and the p
d4e0: 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
d4f0: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d  sive mode, the m
d500: 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
d510: 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75  under.**     jou
d520: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
d530: 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  T is used instea
d540: 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  d..**.** After t
d550: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69  he journal is fi
d560: 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e  nalized, if runn
d570: 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
d580: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sive mode, the.*
d590: 2a 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  * pager moves to
d5a0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
d5b0: 61 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61  ate (and downgra
d5c0: 64 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  des the lock on 
d5d0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
d5e0: 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  file accordingly
d5f0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
d600: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
d610: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
d620: 64 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47  de and is in PAG
d630: 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c  ER_SYNCED state,
d640: 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20  .** it moves to 
d650: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e  PAGER_EXCLUSIVE.
d660: 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f   No locks are do
d670: 77 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75  wngraded when ru
d680: 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c  nning in.** excl
d690: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
d6a0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
d6b0: 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
d6c0: 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
d6d0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
d6e0: 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
d6f0: 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
d700: 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
d710: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
d720: 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
d730: 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
d740: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
d750: 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
d760: 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
d770: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
d780: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
d790: 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
d7a0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
d7b0: 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
d7c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
d7d0: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
d7e0: 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
d7f0: 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
d800: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
d810: 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
d820: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
d830: 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
d840: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
d850: 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
d860: 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
d870: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
d880: 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
d890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d8a0: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
d8b0: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
d8c0: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
d8d0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
d8e0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d8f0: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
d900: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
d910: 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
d920: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
d930: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d940: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
d950: 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
d960: 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
d970: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
d980: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
d990: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
d9a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d9b0: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
d9c0: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
d9d0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
d9e0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
d9f0: 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
da00: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
da10: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
da20: 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
da30: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
da40: 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
da50: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
da60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
da70: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
da80: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
da90: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
daa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
dab0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
dac0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
dad0: 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
dae0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
daf0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
db00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
db10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
db20: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
db30: 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
db40: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
db50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
db60: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
db70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
db80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
db90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
dba0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
dbb0: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  jfd, 0);.      }
dbc0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
dbd0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
dbe0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
dbf0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
dc00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
dc10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
dc20: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
dc30: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
dc40: 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
dc50: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
dc60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dc70: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
dc80: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
dc90: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
dca0: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
dcb0: 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
dcc0: 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
dcd0: 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
dce0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
dcf0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
dd00: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
dd10: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
dd20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dd30: 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
dd40: 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
dd50: 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
dd60: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
dd70: 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
dd80: 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
dd90: 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
dda0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
ddb0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
ddc0: 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
ddd0: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
dde0: 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
ddf0: 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
de00: 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
de10: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
de20: 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
de30: 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
de40: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a  ournal. .      *
de50: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
de60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
de70: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
de80: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
de90: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
dea0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
deb0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
dec0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
ded0: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
dee0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
def0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
df00: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
df10: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
df20: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
df30: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
df40: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
df50: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
df60: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
df70: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
df80: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
df90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dfa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
dfb0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73  HECK_PAGES.    s
dfc0: 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
dfd0: 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
dfe0: 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
dff0: 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23  set_pagehash);.#
e000: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
e010: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
e020: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
e030: 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
e040: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
e050: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
e060: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   0;.  sqlite3Pca
e070: 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
e080: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
e090: 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
e0a0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
e0b0: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
e0c0: 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
e0d0: 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
e0e0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
e0f0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
e100: 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  RED;..    /* If 
e110: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
e120: 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  as in locking_mo
e130: 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
e140: 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e but is no long
e150: 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72 6f 70 20  er,.    ** drop 
e160: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
e170: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  ck held on the d
e180: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
e190: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 32    */.    if( rc2
e1a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
e1b0: 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78    && !pPager->ex
e1c0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
e1d0: 20 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45    && sqlite3WalE
e1e0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
e1f0: 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 20 0a 20  ger->pWal, 0) . 
e200: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20     ){.      rc2 
e210: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
e220: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
e230: 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  CK);.    }.  }el
e240: 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
e250: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
e260: 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
e270: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
e280: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
e290: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e2a0: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
e2b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
e2c0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
e2d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
e2e0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
e2f0: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
e300: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e310: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
e320: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
e330: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
e340: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
e350: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e360: 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a  dbModified = 0;.
e370: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74  .  /* TODO: Is t
e380: 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79  his optimal? Why
e390: 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20   is the db size 
e3a0: 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65  invalidated here
e3b0: 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20   .  ** when the 
e3c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
e3d0: 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a   not unlocked? *
e3e0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  /.  pPager->dbOr
e3f0: 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71  igSize = 0;.  sq
e400: 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
e410: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
e420: 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
e430: 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d  ize);.  if( !MEM
e440: 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
e450: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
e460: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
e470: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
e480: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
e490: 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
e4a0: 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
e4b0: 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
e4c0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
e4d0: 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
e4e0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
e4f0: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
e500: 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
e510: 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
e520: 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
e530: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
e540: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
e550: 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
e560: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
e570: 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
e580: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
e590: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
e5a0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
e5b0: 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
e5c0: 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
e5d0: 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
e5e0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
e5f0: 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
e600: 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
e610: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
e620: 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
e630: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
e640: 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
e650: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
e660: 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
e670: 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
e680: 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
e690: 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
e6a0: 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
e6b0: 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
e6c0: 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
e6d0: 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
e6e0: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
e6f0: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
e700: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
e710: 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
e720: 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
e730: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
e740: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
e750: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
e760: 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
e770: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
e780: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
e790: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
e7a0: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
e7b0: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
e7c0: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
e7d0: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
e7e0: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
e7f0: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
e800: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
e810: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
e820: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
e830: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
e840: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
e850: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
e860: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
e870: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
e880: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
e890: 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
e8a0: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
e8b0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
e8c0: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
e8d0: 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
e8e0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
e8f0: 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
e900: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
e910: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
e920: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
e930: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
e940: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
e950: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
e960: 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
e970: 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
e980: 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
e990: 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
e9a0: 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
e9b0: 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
e9c0: 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
e9d0: 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
e9e0: 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
e9f0: 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
ea00: 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
ea10: 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
ea20: 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
ea30: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
ea40: 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
ea50: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
ea60: 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61  e isMainJrnl fla
ea70: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69  g is true if thi
ea80: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f  s is the main ro
ea90: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
eaa0: 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  nd.** false for 
eab0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
eac0: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e  urnal.  The main
ead0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
eae0: 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73  l uses.** checks
eaf0: 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
eb00: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
eb10: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
eb20: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
eb30: 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
eb40: 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
eb50: 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
eb60: 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
eb70: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
eb80: 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
eb90: 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
eba0: 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
ebb0: 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
ebc0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
ebd0: 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
ebe0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
ebf0: 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
ec00: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
ec10: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
ec20: 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
ec30: 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
ec40: 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
ec50: 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
ec60: 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
ec70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
ec80: 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
ec90: 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
eca0: 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
ecb0: 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
ecc0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
ecd0: 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
ece0: 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
ecf0: 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
ed00: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
ed10: 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
ed20: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
ed30: 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
ed40: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
ed50: 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
ed60: 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
ed70: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
ed80: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
ed90: 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
eda0: 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
edb0: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
edc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
edd0: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
ede0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
edf0: 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
ee00: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
ee10: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
ee20: 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
ee30: 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
ee40: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
ee50: 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
ee60: 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
ee70: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
ee80: 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
ee90: 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
eea0: 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
eeb0: 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
eec0: 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
eed0: 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
eee0: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
eef0: 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
ef00: 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
ef10: 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
ef20: 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
ef30: 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
ef40: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
ef50: 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
ef60: 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
ef70: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
ef80: 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
ef90: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
efa0: 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
efb0: 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
efc0: 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
efd0: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
efe0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
eff0: 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
f000: 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
f010: 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
f020: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
f030: 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
f040: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
f050: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
f060: 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
f070: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
f080: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
f090: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
f0a0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
f0b0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
f0c0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
f0d0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
f0e0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
f0f0: 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
f100: 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
f110: 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
f120: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
f130: 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
f140: 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
f150: 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
f160: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
f170: 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
f180: 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
f190: 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
f1a0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
f1b0: 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
f1c0: 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
f1d0: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
f1e0: 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f200: 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
f210: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
f220: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
f230: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f250: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
f260: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
f270: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f290: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
f2a0: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
f2b0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
f2c0: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
f2e0: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
f2f0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
f300: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
f310: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
f320: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
f330: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
f340: 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
f350: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
f360: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f370: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
f380: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
f390: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
f3a0: 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
f3b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
f3c0: 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
f3d0: 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20  is synced */..  
f3e0: 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a  assert( (isMainJ
f3f0: 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  rnl&~1)==0 );   
f400: 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c     /* isMainJrnl
f410: 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
f420: 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70  assert( (isSavep
f430: 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nt&~1)==0 );    
f440: 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20     /* isSavepnt 
f450: 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
f460: 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e  ssert( isMainJrn
f470: 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20  l || pDone );   
f480: 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79    /* pDone alway
f490: 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f  s used on sub-jo
f4a0: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65  urnals */.  asse
f4b0: 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c  rt( isSavepnt ||
f4c0: 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f   pDone==0 );   /
f4d0: 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73  * pDone never us
f4e0: 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f  ed on non-savepo
f4f0: 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20  int */..  aData 
f500: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
f510: 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ace;.  assert( a
f520: 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20  Data );         
f530: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
f540: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
f550: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
f560: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61   */.  assert( pa
f570: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
f580: 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e  )==0 || (!isMain
f590: 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e  Jrnl && isSavepn
f5a0: 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  t) );..  /* Read
f5b0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
f5c0: 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
f5d0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f5e0: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
f5f0: 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
f600: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
f610: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
f620: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
f630: 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
f640: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
f650: 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
f660: 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
f670: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
f680: 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
f690: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
f6a0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
f6b0: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
f6c0: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
f6d0: 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
f6e0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
f6f0: 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
f700: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f710: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
f720: 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
f730: 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
f740: 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
f750: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
f760: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
f770: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
f780: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
f790: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
f7a0: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
f7b0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
f7c0: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
f7d0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
f7e0: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
f7f0: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
f800: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
f810: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
f820: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
f830: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
f840: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
f850: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
f860: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
f870: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
f880: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
f890: 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
f8a0: 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
f8b0: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
f8c0: 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
f8d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f8e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
f8f0: 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
f900: 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
f910: 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
f920: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
f930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f940: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
f950: 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
f960: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
f970: 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
f980: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
f990: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
f9a0: 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
f9b0: 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
f9c0: 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
f9d0: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
f9e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f9f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
fa00: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e  .  }..  if( pDon
fa10: 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
fa20: 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e  e3BitvecSet(pDon
fa30: 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54  e, pgno))!=SQLIT
fa40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
fa50: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  rn rc;.  }..  as
fa60: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
fa70: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
fa80: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
fa90: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
faa0: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
fab0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
fac0: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
fad0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
fae0: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
faf0: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
fb00: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
fb10: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
fb20: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
fb30: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
fb40: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
fb50: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
fb60: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
fb70: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
fb80: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
fb90: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
fba0: 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
fbb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
fbc0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
fbd0: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
fbe0: 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
fbf0: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
fc00: 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
fc10: 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
fc20: 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
fc30: 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
fc40: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
fc50: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
fc60: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
fc70: 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
fc80: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
fc90: 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
fca0: 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
fcb0: 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
fcc0: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
fcd0: 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
fce0: 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
fcf0: 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
fd00: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
fd10: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
fd20: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
fd30: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
fd40: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
fd50: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
fd60: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
fd70: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
fd80: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
fd90: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
fda0: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
fdb0: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
fdc0: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
fdd0: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
fde0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
fdf0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
fe00: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
fe10: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
fe20: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
fe30: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
fe40: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
fe50: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
fe60: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
fe70: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
fe80: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
fe90: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
fea0: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
feb0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
fec0: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
fed0: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
fee0: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
fef0: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
ff00: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
ff10: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
ff20: 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
ff30: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
ff40: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
ff50: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
ff60: 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
ff70: 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
ff80: 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
ff90: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
ffa0: 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
ffb0: 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
ffc0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
ffd0: 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
ffe0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
fff0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
10000 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
10010 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
10020 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
10030 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
10040 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
10050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
10060 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
10070 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
10080 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
10090 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
100a0 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
100b0 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
100c0 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
100d0 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
100e0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
100f0 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
10100 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
10110 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
10120 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
10130 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
10140 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
10150 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
10160 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
10170 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
10180 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
10190 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
101a0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
101b0 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
101c0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
101d0 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
101e0 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
101f0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
10200 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  */.  if( pagerUs
10210 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
10220 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d      pPg = 0;.  }
10230 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20  else{.    pPg = 
10240 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
10250 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
10260 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
10270 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47   !MEMDB );.  PAG
10280 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
10290 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
102a0 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
102b0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
102c0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
102d0 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
102e0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
102f0 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a  e, (u8*)aData),.
10300 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
10310 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
10320 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
10330 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
10340 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
10350 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50     isSynced = pP
10360 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
10370 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61  (*pOffset <= pPa
10380 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
10390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
103a0 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d  sSynced = (pPg==
103b0 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
103c0 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
103d0 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69  _SYNC));.  }.  i
103e0 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  f( (pPager->stat
103f0 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
10400 56 45 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e  VE).   && isOpen
10410 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
10420 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
10430 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
10440 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
10450 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
10460 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
10470 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
10480 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
10490 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
104a0 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
104b0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
104c0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
104d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
104e0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
104f0 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
10500 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
10510 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
10520 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
10530 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
10540 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
10550 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
10560 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10570 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
10580 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
10590 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
105a0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
105b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
105c0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
105d0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
105e0 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
105f0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
10600 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
10610 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
10620 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
10630 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
10640 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
10650 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
10660 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
10670 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
10680 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
10690 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
106a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
106b0 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
106c0 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
106d0 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
106e0 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
106f0 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
10700 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
10710 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
10720 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
10730 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
10740 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
10750 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
10760 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
10770 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
10780 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
10790 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
107a0 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
107b0 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
107c0 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
107d0 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
107e0 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
107f0 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
10800 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
10810 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
10820 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
10830 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
10840 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
10850 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
10860 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
10870 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
10880 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
10890 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
108a0 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
108b0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
108c0 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
108d0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
108e0 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
108f0 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
10900 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
10910 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
10920 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
10930 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
10940 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
10950 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
10960 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
10970 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
10980 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
10990 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
109a0 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
109b0 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
109c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
109d0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
109e0 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
109f0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
10a00 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
10a10 67 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f  g, 1))!=SQLITE_O
10a20 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
10a30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
10a40 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50  pPg->flags &= ~P
10a50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a  GHDR_NEED_READ;.
10a60 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
10a70 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
10a80 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
10a90 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
10aa0 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
10ab0 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
10ac0 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
10ad0 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
10ae0 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
10af0 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
10b00 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
10b10 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
10b20 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
10b30 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
10b40 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
10b50 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
10b60 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
10b70 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
10b80 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
10b90 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
10ba0 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
10bb0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
10bc0 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
10bd0 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
10be0 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20  Data;.    pData 
10bf0 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
10c00 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
10c10 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
10c20 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
10c30 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
10c40 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69  iter(pPg);.    i
10c50 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  f( isMainJrnl &&
10c60 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20   (!isSavepnt || 
10c70 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72  *pOffset<=pPager
10c80 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b  ->journalHdr) ){
10c90 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10ca0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
10cb0 73 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74  s page were just
10cc0 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74   restored from t
10cd0 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a  he main .      *
10ce0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  * journal file, 
10cf0 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74  then its content
10d00 20 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79   must be as they
10d10 20 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a   were when the .
10d20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
10d30 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f  tion was first o
10d40 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  pened. In this c
10d50 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20  ase we can mark 
10d60 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
10d70 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63  * as clean, sinc
10d80 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20  e there will be 
10d90 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  no need to write
10da0 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20   it out to the. 
10db0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
10dc0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
10dd0 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65   ** There is one
10de0 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
10df0 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20  is rule. If the 
10e00 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f  page is being ro
10e10 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  lled.      ** ba
10e20 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ck as part of a 
10e30 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74  savepoint (or st
10e40 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63  atement) rollbac
10e50 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20  k from an .     
10e60 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   ** unsynced por
10e70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e  tion of the main
10e80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
10e90 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hen it is not sa
10ea0 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  fe.      ** to m
10eb0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
10ec0 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62  clean. This is b
10ed0 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74  ecause marking t
10ee0 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20  he page as.     
10ef0 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63   ** clean will c
10f00 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
10f10 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53  EED_SYNC flag. S
10f20 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73  ince the page is
10f30 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
10f40 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
10f50 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20   file (recorded 
10f60 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
10f70 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  nal) and.      *
10f80 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
10f90 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c  _SYNC flag is cl
10fa0 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61  eared, if the pa
10fb0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ge is written to
10fc0 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
10fd0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
10fe0 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  saction, it will
10ff0 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
11000 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a  rty but.      **
11010 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
11020 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e  SYNC flag will n
11030 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f  ot be set. It co
11040 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69  uld then potenti
11050 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65  ally.      ** be
11060 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74   written out int
11070 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
11080 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a  ile before its j
11090 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20  ournal file.    
110a0 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20    ** segment is 
110b0 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61  synced. If a cra
110c0 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  sh occurs during
110d0 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   or following th
110e0 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  is,.      ** dat
110f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
11100 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20   may ensue..    
11110 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
11120 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
11130 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
11140 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
11150 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
11160 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
11170 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
11180 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
11190 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
111a0 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
111b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
111c0 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
111d0 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
111e0 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
111f0 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
11200 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
11210 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
11220 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
11230 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
11240 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
11250 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
11260 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
11270 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
11280 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
11290 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
112a0 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
112b0 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
112c0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
112d0 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
112e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
112f0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
11300 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
11310 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11320 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
11330 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
11340 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
11350 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
11360 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
11370 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
11380 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
11390 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
113a0 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
113b0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
113c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
113d0 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
113e0 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
113f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11400 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
11410 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
11420 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
11430 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
11440 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
11450 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
11460 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
11470 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
11480 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
11490 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
114a0 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
114b0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
114c0 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
114d0 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
114e0 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
114f0 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
11500 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
11510 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
11520 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
11530 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
11540 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
11550 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
11560 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
11570 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
11580 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
11590 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
115a0 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
115b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
115c0 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
115d0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
115e0 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
115f0 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
11600 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
11610 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
11620 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
11630 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
11640 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
11650 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
11660 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
11670 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
11680 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
11690 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
116a0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
116b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
116c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
116d0 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
116e0 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
116f0 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
11700 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
11710 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
11720 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
11730 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
11740 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
11750 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
11760 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
11770 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
11780 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
11790 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
117a0 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
117b0 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
117c0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
117d0 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
117e0 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
117f0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
11800 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
11810 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
11820 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
11830 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
11840 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
11850 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
11860 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
11870 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
11880 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
11890 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
118a0 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
118b0 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
118c0 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
118d0 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
118e0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
118f0 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
11900 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
11910 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
11920 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
11930 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
11940 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
11950 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
11960 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
11970 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
11980 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
11990 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
119a0 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
119b0 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
119c0 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
119d0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
119e0 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
119f0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
11a00 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
11a10 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
11a20 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
11a30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
11a40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11a50 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
11a60 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
11a70 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
11a80 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
11a90 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
11aa0 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
11ab0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
11ac0 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
11ad0 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
11ae0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
11af0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
11b00 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
11b10 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b30 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
11b40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
11b50 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
11b60 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
11b70 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
11b80 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
11b90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
11ba0 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
11bb0 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
11bc0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
11bd0 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
11be0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
11bf0 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
11c00 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11c10 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
11c20 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
11c30 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
11c40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11c50 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  le */..  /* Allo
11c60 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
11c70 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
11c80 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
11c90 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
11ca0 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
11cb0 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
11cc0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11cd0 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
11ce0 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
11cf0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
11d00 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
11d10 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
11d20 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
11d30 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
11d40 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
11d50 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
11d60 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
11d70 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
11d80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
11da0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
11db0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
11dc0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
11dd0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
11de0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11df0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
11e00 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
11e10 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
11e20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11e30 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
11e40 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d  ter_out;..  rc =
11e50 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11e60 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
11e70 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
11e80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11e90 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
11ea0 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
11eb0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
11ec0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
11ed0 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
11ee0 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
11ef0 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
11f00 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
11f10 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
11f20 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
11f30 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11f40 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
11f50 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
11f60 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
11f70 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
11f80 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
11f90 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
11fa0 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
11fb0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
11fc0 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72  loc((int)nMaster
11fd0 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
11fe0 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 20 20 69  rPtr + 1);.    i
11ff0 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
12000 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
12010 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12020 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12030 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
12040 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20     zMasterPtr = 
12050 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
12060 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
12070 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ];.    rc = sqli
12080 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
12090 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
120a0 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
120b0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
120c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
120d0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
120e0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7a 4d 61 73  er_out;.    zMas
120f0 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
12100 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
12110 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
12120 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
12130 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
12140 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
12150 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
12160 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nal ){.      int
12170 20 65 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72   exists;.      r
12180 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
12190 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
121a0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
121b0 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
121c0 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
121d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
121e0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
121f0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
12200 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 78 69   }.      if( exi
12210 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  sts ){.        /
12220 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
12230 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
12240 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
12250 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
12260 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
12270 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
12280 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
12290 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
122a0 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
122b0 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
122c0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
122d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
122e0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
122f0 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
12300 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
12310 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
12320 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
12330 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
12340 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
12350 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
12360 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
12370 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
12380 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
123a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
123b0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
123c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
123d0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
123e0 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
123f0 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
12400 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
12410 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12420 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
12430 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12440 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12450 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
12460 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
12470 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
12480 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
12490 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
124a0 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
124b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  ;.        if( c 
124c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
124d0 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
124e0 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
124f0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12500 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
12510 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12520 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
12530 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
12540 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
12550 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
12560 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20  ournal)+1);.    
12570 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20  }.  }.  .  rc = 
12580 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
12590 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
125a0 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
125b0 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
125c0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
125d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
125e0 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  terJournal);.  }
125f0 20 20 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72    .  if( pMaster
12600 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
12610 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
12620 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
12630 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29  Open(pJournal) )
12640 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
12650 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
12660 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
12670 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12680 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
12690 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
126a0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
126b0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
126c0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
126d0 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
126e0 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
126f0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
12700 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
12710 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
12720 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
12730 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
12740 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
12750 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
12760 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
12770 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20  not open, or an 
12780 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
12790 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74  s not.** held, t
127a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
127b0 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
127c0 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  se, the size of 
127d0 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  the file is.** c
127e0 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20  hanged to nPage 
127f0 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61  pages (nPage*pPa
12800 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
12810 74 65 73 29 2e 20 49 66 20 74 68 65 20 66 69 6c  tes). If the fil
12820 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20  e.** on disk is 
12830 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
12840 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
12850 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
12860 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
12870 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
12880 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
12890 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
128a0 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
128b0 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
128c0 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
128d0 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
128e0 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
128f0 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
12900 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
12910 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
12920 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
12930 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
12940 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
12950 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
12960 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
12970 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
12980 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
12990 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
129a0 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
129b0 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
129c0 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
129d0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
129e0 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
129f0 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
12a00 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
12a10 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
12a20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
12a30 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
12a40 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
12a50 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
12a60 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
12a70 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
12a80 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
12a90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12aa0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
12ab0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
12ac0 45 58 43 4c 55 53 49 56 45 20 26 26 20 69 73 4f  EXCLUSIVE && isO
12ad0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
12ae0 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
12af0 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
12b00 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
12b10 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
12b20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
12b30 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
12b40 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
12b50 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
12b60 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
12b70 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50      newSize = pP
12b80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
12b90 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
12ba0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12bb0 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
12bc0 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
12bd0 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
12be0 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
12bf0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12c00 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
12c10 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
12c20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12c30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12c40 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
12c50 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65  r->fd, "", 1, ne
12c60 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  wSize-1);.      
12c70 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
12c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12c90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
12ca0 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
12cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12cc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
12ce0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
12cf0 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
12d00 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
12d10 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
12d20 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
12d30 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
12d40 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
12d50 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
12d60 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
12d70 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
12d80 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
12d90 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
12da0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
12db0 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
12dc0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
12dd0 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
12de0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
12df0 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
12e00 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
12e10 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
12e20 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
12e30 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
12e40 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
12e50 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
12e60 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
12e70 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
12e80 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
12e90 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
12ea0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
12eb0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
12ec0 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
12ed0 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
12ee0 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
12ef0 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
12f00 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
12f10 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
12f20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
12f30 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
12f40 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
12f50 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
12f60 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
12f70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
12f80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
12f90 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
12fa0 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
12fb0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12fc0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
12fd0 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
12fe0 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
12ff0 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
13000 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
13010 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
13020 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
13030 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
13040 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
13050 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
13060 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
13070 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
13080 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
13090 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
130a0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
130b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
130c0 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
130d0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
130e0 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
130f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
13100 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
13110 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
13120 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
13130 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
13140 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
13150 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
13160 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
13170 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
13180 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
13190 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
131a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
131b0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
131c0 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
131d0 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
131e0 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
131f0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
13200 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
13210 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
13220 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
13230 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
13240 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
13250 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
13260 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
13270 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
13280 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
13290 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
132a0 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
132b0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
132c0 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
132d0 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
132e0 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
132f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
13300 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
13310 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
13320 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
13330 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
13340 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
13350 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
13360 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
13370 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
13380 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
13390 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
133a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
133b0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
133c0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
133d0 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
133e0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
133f0 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
13400 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
13410 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
13420 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
13430 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
13440 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
13450 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
13460 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
13470 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
13480 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
13490 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
134a0 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
134b0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
134c0 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
134d0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
134e0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
134f0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
13500 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
13510 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
13520 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
13530 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
13540 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
13550 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
13560 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
13570 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
13580 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
13590 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
135a0 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
135b0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
135c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
135d0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
135e0 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
135f0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
13600 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
13610 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
13620 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
13630 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
13640 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
13650 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
13660 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
13670 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
13680 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
13690 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
136a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
136b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
136c0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
136d0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
136e0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
136f0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
13700 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
13710 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
13720 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
13730 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13740 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
13750 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
13760 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
13770 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
13780 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
13790 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
137a0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
137b0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
137c0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
137d0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
137e0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
137f0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
13800 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
13810 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
13820 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
13830 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
13840 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
13850 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
13860 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
13870 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
13880 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
13890 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
138a0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
138b0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
138c0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
138d0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
138e0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
138f0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
13900 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
13910 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
13920 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
13930 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
13940 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
13950 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
13960 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
13970 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
13980 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
13990 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
139a0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
139b0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
139c0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
139d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
139e0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
139f0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
13a00 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
13a10 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
13a20 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
13a30 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
13a40 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
13a50 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
13a60 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
13a70 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
13a80 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
13a90 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
13aa0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
13ab0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
13ac0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
13ad0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
13ae0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
13af0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
13b00 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
13b10 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
13b20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
13b30 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
13b40 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
13b50 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
13b60 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
13b70 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
13b80 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
13b90 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
13ba0 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
13bb0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
13bc0 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
13bd0 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
13be0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
13bf0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
13c00 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
13c10 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
13c20 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
13c30 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
13c40 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
13c50 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
13c60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
13c70 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
13c80 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
13c90 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
13ca0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
13cb0 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
13cc0 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
13cd0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
13ce0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
13cf0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d10 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
13d20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
13d30 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
13d40 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
13d50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13d60 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
13d70 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
13d80 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
13d90 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
13da0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
13db0 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
13dc0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
13dd0 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
13de0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
13df0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e10 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
13e20 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
13e30 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e50 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
13e60 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
13e70 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
13e80 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
13e90 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
13ea0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13eb0 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
13ec0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
13ed0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
13ee0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
13ef0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
13f00 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
13f10 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
13f20 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
13f30 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
13f40 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
13f50 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
13f60 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
13f70 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
13f80 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13f90 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
13fa0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
13fb0 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
13fc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13fd0 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
13fe0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
13ff0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
14000 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
14010 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
14020 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
14030 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
14040 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
14050 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
14060 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
14070 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
14080 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
14090 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
140a0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
140b0 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
140c0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
140d0 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
140e0 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
140f0 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
14100 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
14110 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
14120 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
14130 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
14140 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
14150 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
14160 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
14170 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
14180 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
14190 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
141a0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
141b0 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
141c0 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
141d0 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
141e0 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
141f0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
14200 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
14210 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
14220 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
14230 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
14240 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
14250 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
14260 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
14270 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
14280 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
14290 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
142a0 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
142b0 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
142c0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
142d0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
142e0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
142f0 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
14300 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
14310 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14320 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
14330 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
14340 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
14350 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
14360 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
14370 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
14380 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
14390 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
143a0 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
143b0 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
143c0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
143d0 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
143e0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
143f0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
14400 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
14410 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
14420 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
14430 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
14440 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
14450 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
14460 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
14470 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
14480 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
14490 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
144a0 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
144b0 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
144c0 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
144d0 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
144e0 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
144f0 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
14500 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
14510 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
14520 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
14530 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
14540 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
14550 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
14560 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
14570 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
14580 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14590 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
145a0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
145b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
145c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
145d0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
145e0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
145f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
14600 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
14610 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
14620 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
14630 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
14640 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
14650 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
14660 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14670 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
14680 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
14690 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
146a0 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
146b0 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
146c0 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
146d0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
146e0 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
146f0 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
14700 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14710 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
14720 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14730 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14740 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
14750 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
14760 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
14770 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
14780 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
14790 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
147a0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
147b0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
147c0 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
147d0 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
147e0 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
147f0 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
14800 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
14810 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
14820 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
14830 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
14840 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
14850 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
14860 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
14870 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
14880 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
14890 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
148a0 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
148b0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
148c0 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
148d0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
148e0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
148f0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
14900 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
14910 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
14920 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
14930 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
14940 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
14950 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
14960 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
14970 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
14980 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
14990 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
149a0 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
149b0 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
149c0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
149d0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
149e0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
149f0 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
14a00 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
14a10 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
14a20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
14a30 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14a40 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
14a50 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
14a60 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
14a70 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
14a80 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
14a90 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
14aa0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
14ab0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
14ac0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
14ad0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
14ae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14af0 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
14b00 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
14b10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
14b20 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
14b30 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
14b40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
14b50 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
14b60 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
14b70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
14b80 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
14b90 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
14ba0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
14bb0 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
14bc0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
14bd0 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
14be0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
14bf0 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
14c00 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
14c10 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
14c20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
14c30 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
14c40 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
14c50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
14c60 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
14c70 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
14c80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14c90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
14ca0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
14cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14cc0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
14cd0 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
14ce0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
14cf0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
14d00 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
14d10 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
14d20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
14d30 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
14d40 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
14d50 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
14d60 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
14d70 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
14d80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
14d90 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
14da0 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
14db0 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
14dc0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
14dd0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
14de0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
14df0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14e00 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
14e10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14e20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
14e30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
14e40 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
14e50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14e60 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
14e70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
14e80 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
14e90 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
14ea0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
14eb0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
14ec0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
14ed0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
14ee0 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
14ef0 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
14f00 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
14f10 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
14f20 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
14f30 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
14f40 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
14f50 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
14f60 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
14f70 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
14f80 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
14f90 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
14fa0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
14fb0 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
14fc0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
14fd0 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
14fe0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
14ff0 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
15000 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
15010 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
15020 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
15030 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
15040 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
15050 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
15060 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
15070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
15080 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
15090 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
150a0 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
150b0 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
150c0 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
150d0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
150e0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
150f0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
15100 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
15110 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
15120 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
15130 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
15140 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
15150 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
15160 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
15170 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
15180 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
15190 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
151a0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
151b0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
151c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
151d0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
151e0 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
151f0 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
15200 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
15210 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
15220 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15230 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
15240 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
15250 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
15260 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
15270 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
15280 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
15290 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
152a0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
152b0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
152c0 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
152d0 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
152e0 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
152f0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
15300 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
15310 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
15320 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
15330 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
15340 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
15350 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
15360 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
15370 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
15380 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
15390 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
153a0 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
153b0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
153c0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
153d0 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
153e0 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
153f0 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
15400 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
15410 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
15420 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
15430 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
15440 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
15450 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
15460 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
15470 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
15480 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
15490 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
154a0 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
154b0 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
154c0 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
154d0 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
154e0 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
154f0 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
15500 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
15510 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
15520 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
15530 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
15540 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
15550 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
15560 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
15570 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
15580 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
15590 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
155a0 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
155b0 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
155c0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
155d0 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
155e0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
155f0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
15600 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
15610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15620 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
15630 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
15640 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
15650 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
15660 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
15670 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
15680 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
15690 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
156a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
156b0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
156c0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
156d0 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20  r->noSync==0 && 
156e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
156f0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
15700 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15710 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
15720 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
15730 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
15740 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15750 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  K && pPager->noS
15760 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ync==0 && pPager
15770 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
15780 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
15790 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
157a0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
157b0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
157c0 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
157d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
157e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
157f0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
15800 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
15810 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73  !='\0');.    tes
15820 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
15830 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
15840 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15850 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
15860 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
15870 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
15880 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
15890 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
158a0 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
158b0 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
158c0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
158d0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
158e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
158f0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
15900 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
15910 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
15920 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
15930 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
15940 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
15950 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
15960 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
15970 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
15980 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
15990 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
159a0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
159b0 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
159c0 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
159d0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
159e0 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
159f0 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
15a00 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
15a10 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
15a20 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
15a30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
15a40 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
15a50 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
15a60 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
15a70 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
15a80 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
15a90 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
15aa0 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
15ab0 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
15ac0 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
15ad0 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
15ae0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
15af0 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
15b00 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
15b10 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
15b20 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
15b30 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
15b40 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
15b50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15b60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
15b70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
15b80 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
15b90 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
15ba0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
15bb0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
15bc0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
15bd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
15be0 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
15bf0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
15c00 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
15c10 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f  ager; /* Pager o
15c20 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
15c30 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a   with page pPg *
15c40 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  /.  Pgno pgno = 
15c50 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20  pPg->pgno;      
15c60 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
15c70 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
15c80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
15ca0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
15cb0 74 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20  t isInWal = 0;  
15cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15cd0 75 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e  ue if page is in
15ce0 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69   log file */.  i
15cf0 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
15d00 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
15d10 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
15d20 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
15d30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
15d40 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
15d50 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
15d60 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
15d70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
15d80 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70   if( NEVER(!isOp
15d90 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
15da0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15db0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
15dc0 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
15dd0 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
15de0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
15df0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15e00 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
15e10 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
15e20 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ger) ){.    /* T
15e30 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
15e40 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
15e50 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
15e60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15e70 33 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d  3WalRead(pPager-
15e80 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73  >pWal, pgno, &is
15e90 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67  InWal, pgsz, pPg
15ea0 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  ->pData);.  }.  
15eb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15ec0 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 7b  K && !isInWal ){
15ed0 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
15ee0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
15ef0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
15f00 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
15f10 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
15f20 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
15f30 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
15f40 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
15f50 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
15f60 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
15f70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15f80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
15f90 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
15fa0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
15fb0 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
15fc0 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
15fd0 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
15fe0 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
15ff0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
16000 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
16010 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
16020 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
16030 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
16040 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
16050 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
16060 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
16070 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
16080 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
16090 6f 2e 20 20 42 79 74 65 73 20 33 32 2e 2e 33 35  o.  Bytes 32..35
160a0 20 61 6e 64 20 33 35 2e 2e 33 39 20 73 68 6f 75   and 35..39 shou
160b0 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
160c0 72 73 20 77 68 69 63 68 20 61 72 65 0a 20 20 20  rs which are.   
160d0 20 20 20 2a 2a 20 6e 65 76 65 72 20 30 78 66 66     ** never 0xff
160e0 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
160f0 69 6e 67 20 70 50 61 67 65 72 2d 3e 64 62 46 69  ing pPager->dbFi
16100 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
16110 6c 20 30 78 66 66 0a 20 20 20 20 20 20 2a 2a 20  l 0xff.      ** 
16120 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
16130 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
16140 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
16150 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
16160 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
16170 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
16180 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
16190 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
161a0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
161b0 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
161c0 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
161d0 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
161e0 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e   noising equalin
161f0 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
16200 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
16210 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
16220 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
16230 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
16240 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
16250 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
16260 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
16270 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
16280 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
16290 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
162a0 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
162b0 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
162c0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
162d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
162e0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
162f0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
16300 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
16310 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
16320 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
16330 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
16340 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  = SQLITE_NOMEM);
16350 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
16360 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
16370 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
16380 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
16390 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
163a0 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
163b0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
163c0 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
163d0 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
163e0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
163f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16400 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
16410 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
16420 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
16430 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16440 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16450 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54  OMIT_WAL./*.** T
16460 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16470 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72  invoked once for
16480 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20   each page that 
16490 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
164a0 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
164b0 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77  o the log file w
164c0 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61  hen a WAL transa
164d0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
164e0 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74  back..** Paramet
164f0 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61  er iPg is the pa
16500 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69  ge number of sai
16510 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78  d page. The pCtx
16520 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73   argument .** is
16530 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e   actually a poin
16540 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
16550 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
16560 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73  * If page iPg is
16570 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
16580 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e  cache, and has n
16590 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
165a0 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20  ferences,.** it 
165b0 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74  is discarded. Ot
165c0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72  herwise, if ther
165d0 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  e are one or mor
165e0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a  e outstanding.**
165f0 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65   references, the
16600 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
16610 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74   reloaded from t
16620 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
16630 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74  the.** attempt t
16640 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74  o reload content
16650 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
16660 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61  se is required a
16670 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65  nd fails, .** re
16680 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
16690 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
166a0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
166b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
166c0 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
166d0 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e  (void *pCtx, Pgn
166e0 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63  o iPg){.  int rc
166f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16700 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
16710 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20  (Pager *)pCtx;. 
16720 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
16730 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
16740 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
16750 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67   iPg);.  if( pPg
16760 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
16770 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66  te3PcachePageRef
16780 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b  count(pPg)==1 ){
16790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
167a0 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
167b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
167c0 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
167d0 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
167e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
167f0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
16800 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
16810 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16820 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
16830 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
16840 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
16850 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
16860 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
16870 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
16880 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
16890 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
168a0 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
168b0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
168c0 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
168d0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
168e0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
168f0 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
16900 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
16910 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
16920 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
16930 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
16940 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
16950 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
16960 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
16970 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
16980 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
16990 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
169a0 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
169b0 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
169c0 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
169d0 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
169e0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
169f0 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
16a00 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
16a10 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
16a20 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
16a30 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
16a40 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
16a50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
16a60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
16a70 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
16a80 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
16a90 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
16aa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16ab0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
16ac0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
16ad0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16af0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
16b00 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
16b10 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
16b20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
16b30 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
16b40 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
16b50 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
16b60 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
16b70 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
16b80 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
16b90 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
16ba0 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
16bb0 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
16bc0 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
16bd0 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
16be0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
16bf0 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
16c00 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
16c10 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
16c20 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
16c30 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
16c40 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
16c50 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
16c60 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
16c70 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
16c80 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
16c90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16ca0 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
16cb0 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
16cc0 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
16cd0 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
16ce0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
16cf0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
16d00 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77  r->pPCache);.  w
16d10 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72  hile( pList && r
16d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16d30 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
16d40 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
16d50 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
16d60 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f  UndoCallback((vo
16d70 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  id *)pPager, pLi
16d80 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  st->pgno);.    p
16d90 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
16da0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
16db0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
16dc0 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
16dd0 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
16de0 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41  e3WalFrames(). A
16df0 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e  s well as loggin
16e00 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
16e10 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66  s of the list of
16e20 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79   pages headed by
16e30 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65   pList (connecte
16e40 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a  d by pDirty),.**
16e50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
16e60 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69  otifies any acti
16e70 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ve backup proces
16e80 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ses that the pag
16e90 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67  es have.** chang
16ea0 65 64 2e 20 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ed. .*/ .static 
16eb0 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d  int pagerWalFram
16ec0 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  es(.  Pager *pPa
16ed0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
16ee0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
16ef0 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72  bject */.  PgHdr
16f00 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
16f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
16f20 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20  st of frames to 
16f30 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54  log */.  Pgno nT
16f40 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
16f50 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
16f60 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20  base size after 
16f70 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  this commit */. 
16f80 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c 20 20   int isCommit,  
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fa0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
16fb0 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a   is a commit */.
16fc0 20 20 69 6e 74 20 73 79 6e 63 5f 66 6c 61 67 73    int sync_flags
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
16ff0 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29 20 28  ss to OsSync() (
17000 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  or 0) */.){.  in
17010 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17030 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
17040 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17050 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 72 63 20  r->pWal );.  rc 
17060 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  = sqlite3WalFram
17070 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  es(pPager->pWal,
17080 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
17090 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c  pageSize, pList,
170a0 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f   nTruncate, isCo
170b0 6d 6d 69 74 2c 20 73 79 6e 63 5f 66 6c 61 67 73  mmit, sync_flags
170c0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
170d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
170e0 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
170f0 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
17100 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
17110 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
17120 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
17130 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
17140 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67  ->pBackup, p->pg
17150 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61  no, (u8 *)p->pDa
17160 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ta);.    }.  }. 
17170 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17180 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61  *.** Begin a rea
17190 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d transaction on
171a0 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20   the WAL..**.** 
171b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
171c0 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22  d to be called "
171d0 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f  pagerOpenSnapsho
171e0 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20  t()" because it 
171f0 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d  essentially.** m
17200 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20  akes a snapshot 
17210 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17220 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
17230 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64  oint in time and
17240 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68   preserves.** th
17250 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20  at snapshot for 
17260 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65  use by the reade
17270 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f  r in spite of co
17280 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67  ncurrently chang
17290 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77  es by.** other w
172a0 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70  riters or checkp
172b0 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
172c0 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69  ic int pagerBegi
172d0 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
172e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
172f0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17310 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
17320 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67  e */.  int chang
17330 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
17340 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
17350 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  f cache must be 
17360 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  reset */..  asse
17370 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
17380 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
17390 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
173a0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
173b0 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
173c0 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
173d0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
173e0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
173f0 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
17400 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
17410 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
17420 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
17430 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
17440 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
17450 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
17460 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
17470 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
17480 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
17490 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
174a0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
174b0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
174c0 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
174d0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
174e0 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
174f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
17510 64 75 6d 6d 79 3b 0a 20 20 20 20 69 66 28 20 63  dummy;.    if( c
17520 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 20 20  hanged ){.      
17530 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
17540 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
17550 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
17560 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  de || pPager->db
17570 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  SizeValid==0 );.
17580 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
17590 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
175a0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 64 75  ount(pPager, &du
175b0 6d 6d 79 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  mmy);.  }.  pPag
175c0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
175d0 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20 72 65 74  R_SHARED;..  ret
175e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
175f0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d   Check if the *-
17600 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f  wal file that co
17610 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
17620 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
17630 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78   by pPager.** ex
17640 69 73 74 73 2e 20 41 73 73 75 6d 69 6e 67 20 6e  ists. Assuming n
17650 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
17660 73 65 74 20 2a 70 45 78 69 73 74 73 20 74 6f 20  set *pExists to 
17670 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78  1 if the file ex
17680 69 73 74 73 2c 0a 2a 2a 20 6f 72 20 30 20 6f 74  ists,.** or 0 ot
17690 68 65 72 77 69 73 65 20 61 6e 64 20 72 65 74 75  herwise and retu
176a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
176b0 20 61 6e 20 49 4f 20 6f 72 20 4f 4f 4d 20 65 72   an IO or OOM er
176c0 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
176d0 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  rn.** an SQLite 
176e0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
176f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 48  tatic int pagerH
17700 61 73 57 41 4c 28 50 61 67 65 72 20 2a 70 50 61  asWAL(Pager *pPa
17710 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
17720 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  s){.  int rc;   
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17740 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
17750 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
17760 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
17770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
17780 65 20 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c  e of the WAL fil
17790 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
177a0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
177b0 65 20 29 3b 0a 20 20 7a 57 61 6c 20 3d 20 73 71  e );.  zWal = sq
177c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
177d0 73 2d 77 61 6c 22 2c 20 70 50 61 67 65 72 2d 3e  s-wal", pPager->
177e0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
177f0 28 20 21 7a 57 61 6c 20 29 7b 0a 20 20 20 20 72  ( !zWal ){.    r
17800 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
17810 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
17820 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
17830 65 73 73 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ess(pPager->pVfs
17840 2c 20 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41  , zWal, SQLITE_A
17850 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 70 45  CCESS_EXISTS, pE
17860 78 69 73 74 73 29 3b 0a 20 20 20 20 73 71 6c 69  xists);.    sqli
17870 74 65 33 5f 66 72 65 65 28 7a 57 61 6c 29 3b 0a  te3_free(zWal);.
17880 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
178a0 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
178b0 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
178c0 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
178d0 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
178e0 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 2e 20 49  ger.** exists. I
178f0 66 20 69 74 20 64 6f 65 73 2c 20 6f 70 65 6e 20  f it does, open 
17900 74 68 65 20 70 61 67 65 72 20 69 6e 20 57 41 4c  the pager in WAL
17910 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   mode. Otherwise
17920 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a  , if no error.**
17930 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75   occurs, make su
17940 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  re Pager.journal
17950 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20  Mode is not set 
17960 74 6f 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  to PAGER_JOURNAL
17970 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 20 49 66 20  MODE_WAL..** If 
17980 61 6e 20 49 4f 20 6f 72 20 4f 4f 4d 20 65 72 72  an IO or OOM err
17990 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
179a0 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
179b0 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  r code..**.** If
179c0 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 69 73   the WAL file is
179d0 20 6f 70 65 6e 65 64 2c 20 61 6c 73 6f 20 6f 70   opened, also op
179e0 65 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 28 72  en a snapshot (r
179f0 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ead transaction)
17a00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
17a10 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
17a20 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
17a30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17a40 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
17a50 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
17a60 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
17a70 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
17a80 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
17a90 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
17aa0 41 4c 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  AL, this ensures
17ab0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
17ac0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 62 65 74 77  e condition betw
17ad0 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
17ae0 29 20 0a 2a 2a 20 62 65 6c 6f 77 20 61 6e 64 20  ) .** below and 
17af0 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
17b00 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
17b10 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
17b20 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
17b30 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  int pagerOpenWal
17b40 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20  IfPresent(Pager 
17b50 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
17b60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17b70 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
17b80 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
17b90 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20  nt isWal;       
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17bb0 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65  True if WAL file
17bc0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 72   exists */.    r
17bd0 63 20 3d 20 70 61 67 65 72 48 61 73 57 41 4c 28  c = pagerHasWAL(
17be0 70 50 61 67 65 72 2c 20 26 69 73 57 61 6c 29 3b  pPager, &isWal);
17bf0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17c00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17c10 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
17c20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
17c30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
17c40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17c50 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
17c60 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
17c70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17c80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
17c90 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61   = pagerBeginRea
17ca0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
17cb0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ger);.        }.
17cc0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
17cd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
17ce0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
17cf0 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20  ALMODE_WAL ){.  
17d00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
17d10 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
17d20 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
17d30 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LETE;.      }.  
17d40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17d50 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
17d60 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61  *.** Playback sa
17d70 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69  vepoint pSavepoi
17d80 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65  nt. Or, if pSave
17d90 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65  point==NULL, the
17da0 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68  n playback.** th
17db0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
17dc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
17dd0 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e  e case pSavepoin
17de0 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77  t==NULL occurs w
17df0 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41  hen .** a ROLLBA
17e00 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73  CK TO command is
17e10 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41   invoked on a SA
17e20 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20  VEPOINT that is 
17e30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
17e40 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a  * savepoint..**.
17e50 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69  ** When pSavepoi
17e60 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28  nt is not NULL (
17e70 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72  meaning a non-tr
17e80 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
17e90 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67  int is .** being
17ea0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74   rolled back), t
17eb0 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
17ec0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20   consists of up 
17ed0 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c  to three stages,
17ee0 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e  .** performed in
17ef0 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69   the order speci
17f00 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  fied:.**.**   * 
17f10 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  Pages are played
17f20 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
17f30 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
17f40 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20  ting at byte.** 
17f50 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72      offset Pager
17f60 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
17f70 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
17f80 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65   to .**     Page
17f90 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
17fa0 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65  ffset, or to the
17fb0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
17fc0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
17fd0 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76  file if PagerSav
17fe0 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
17ff0 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  t is zero..**.**
18000 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76     * If PagerSav
18010 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
18020 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
18030 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c  hen pages are pl
18040 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b  ayed.**     back
18050 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74   starting from t
18060 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
18070 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  r immediately fo
18080 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20  llowing .**     
18090 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
180a0 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65  HdrOffset to the
180b0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
180c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
180d0 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
180e0 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62  re then played b
180f0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ack from the sub
18100 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73  -journal file, s
18110 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77  tarting.**     w
18120 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76  ith the PagerSav
18130 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61  epoint.iSubRec a
18140 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
18150 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20   the end of.**  
18160 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
18170 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75  ile..**.** Throu
18180 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61  ghout the rollba
18190 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68  ck process, each
181a0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
181b0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
181c0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
181d0 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
181e0 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  a bitvec structu
181f0 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f  re (variable pDo
18200 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70  ne in the.** imp
18210 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f  lementation belo
18220 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  w). This is used
18230 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
18240 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a  a page is only.*
18250 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  * rolled back th
18260 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20  e first time it 
18270 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
18280 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c  n either journal
18290 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65  ..**.** If pSave
182a0 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  point is NULL, t
182b0 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e  hen pages are on
182c0 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  ly played back f
182d0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  rom the main.** 
182e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
182f0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
18300 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74  or a bitvec in t
18310 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
18320 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
18330 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20  before playback 
18340 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61  commences the Pa
18350 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61  ger.dbSize varia
18360 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20  ble.** is reset 
18370 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  to the value tha
18380 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65  t it held at the
18390 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61   start of the sa
183a0 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20  vepoint .** (or 
183b0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f  transaction). No
183c0 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67   page with a pag
183d0 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e-number greater
183e0 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
183f0 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61  .** is played ba
18400 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e  ck. If one is en
18410 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
18420 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a  simply skipped..
18430 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18440 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
18450 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
18460 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69  er, PagerSavepoi
18470 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b  nt *pSavepoint){
18480 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
18490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
184a0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
184b0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
184c0 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  l */.  i64 iHdrO
184d0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
184e0 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20  /* End of first 
184f0 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d  segment of main-
18500 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
18510 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
18520 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
18530 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
18540 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20    Bitvec *pDone 
18550 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69  = 0;       /* Bi
18560 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70  tvec to ensure p
18570 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b  ages played back
18580 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20   only once */.. 
18590 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
185a0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
185b0 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  ARED );..  /* Al
185c0 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20  locate a bitvec 
185d0 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20  to use to store 
185e0 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73  the set of pages
185f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a   rolled back */.
18600 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
18610 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20   ){.    pDone = 
18620 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
18630 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e  ate(pSavepoint->
18640 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20  nOrig);.    if( 
18650 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  !pDone ){.      
18660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
18670 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
18680 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
18690 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
186a0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
186b0 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
186c0 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
186d0 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
186e0 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
186f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
18700 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
18710 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
18720 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
18730 67 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20 21 70  gSize;..  if( !p
18740 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67  Savepoint && pag
18750 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
18760 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
18770 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
18780 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
18790 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
187a0 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
187b0 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
187c0 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
187d0 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
187e0 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
187f0 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
18800 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
18810 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
18820 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
18830 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
18840 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
18850 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
18860 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
18870 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
18880 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
18890 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
188a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
188b0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
188c0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
188d0 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20   || szJ==0 );.. 
188e0 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
188f0 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
18900 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
18910 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
18920 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
18930 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
18940 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
18950 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
18960 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
18970 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
18980 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
18990 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
189a0 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
189b0 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
189c0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
189d0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
189e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
189f0 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
18a00 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
18a10 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
18a20 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
18a30 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
18a40 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
18a50 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
18a60 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21   pSavepoint && !
18a70 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
18a80 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  er) ){.    iHdrO
18a90 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
18aa0 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
18ab0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
18ac0 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
18ad0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18ae0 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
18af0 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
18b00 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
18b10 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
18b20 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
18b30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
18b40 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
18b50 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
18b60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18b70 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
18b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
18b90 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
18ba0 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ONE );.  }else{.
18bb0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
18bc0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a  nalOff = 0;.  }.
18bd0 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72  .  /* Continue r
18be0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
18bf0 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  rds out of the m
18c00 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
18c10 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65  ting at.  ** the
18c20 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
18c30 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63  eader seen and c
18c40 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20  ontinuing until 
18c50 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e  the effective en
18c60 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61  d.  ** of the ma
18c70 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
18c80 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b    Continue to sk
18c90 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  ip out-of-range 
18ca0 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63  pages and.  ** c
18cb0 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70  ontinue adding p
18cc0 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
18cd0 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a   to pDone..  */.
18ce0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
18cf0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
18d00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
18d10 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
18d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
18d30 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
18d40 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b    u32 nJRec = 0;
18d50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18d60 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
18d70 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
18d80 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
18d90 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
18da0 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52  er, 0, szJ, &nJR
18db0 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
18dc0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
18dd0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20  ITE_DONE );..   
18de0 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22   /*.    ** The "
18df0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
18e00 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
18e10 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
18e20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20  r->journalOff". 
18e30 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65     ** test is re
18e40 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20  lated to ticket 
18e50 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20  #2565.  See the 
18e60 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68  discussion in th
18e70 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70  e.    ** pager_p
18e80 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69  layback() functi
18e90 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
18ea0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
18eb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a     */.    if( nJ
18ec0 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
18ed0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
18ee0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
18ef0 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
18f00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
18f10 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
18f20 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
18f30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18f40 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
18f50 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
18f60 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
18f70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18f80 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
18f90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
18fa0 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
18fb0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
18fc0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
18fd0 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
18fe0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
18ff0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
19000 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
19010 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
19020 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
19030 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
19040 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
19050 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  ==szJ );..  /* F
19060 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
19070 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
19080 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
19090 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
190a0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
190b0 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
190c0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
190d0 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
190e0 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
190f0 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
19100 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
19110 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
19120 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
19130 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
19140 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
19150 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
19160 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
19170 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76 65  4 offset = pSave
19180 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28  point->iSubRec*(
19190 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
191a0 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  ze);..    if( pa
191b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
191c0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
191d0 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f  sqlite3WalSavepo
191e0 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  intUndo(pPager->
191f0 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74  pWal, pSavepoint
19200 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20  ->aWalData);.   
19210 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53   }.    for(ii=pS
19220 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
19230 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
19240 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e   && ii<pPager->n
19250 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20  SubRec; ii++){. 
19260 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66       assert( off
19270 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65  set==ii*(4+pPage
19280 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
19290 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
192a0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
192b0 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
192c0 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
192d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
192e0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
192f0 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
19300 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
19310 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
19320 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19330 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
19340 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
19350 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
19360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
19370 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
19380 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
19390 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
193a0 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
193b0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
193c0 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
193d0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
193e0 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
193f0 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
19400 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
19410 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
19420 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
19430 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
19440 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
19450 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
19460 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
19470 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
19480 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
19490 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
194a0 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
194b0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
194c0 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
194d0 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
194e0 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
194f0 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
19500 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
19510 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
19520 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
19530 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
19540 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
19550 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
19560 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
19570 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
19580 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
19590 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
195a0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
195b0 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
195c0 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
195d0 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
195e0 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
195f0 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
19600 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
19610 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
19620 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
19640 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
19650 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
19660 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
19670 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
19680 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
19690 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
196a0 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
196b0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
196c0 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
196d0 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
196e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
196f0 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
19700 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
19710 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
19720 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
19730 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
19740 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
19750 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
19760 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
19770 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
19780 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
19790 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
197a0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
197b0 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
197c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
197d0 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
197e0 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
197f0 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
19800 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
19810 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
19820 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
19830 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
19840 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
19850 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
19860 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
19870 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
19880 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
19890 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
198a0 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
198b0 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
198c0 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
198d0 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
198e0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
198f0 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
19900 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
19910 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
19920 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
19930 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
19940 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
19950 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
19960 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a  etyLevel(Pager *
19970 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
19980 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e  l, int bFullFsyn
19990 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  c){.  pPager->no
199a0 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d  Sync =  (level==
199b0 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
199c0 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
199d0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
199e0 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21  = (level==3 && !
199f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
19a00 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
19a10 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28  ->sync_flags = (
19a20 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54  bFullFsync?SQLIT
19a30 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49  E_SYNC_FULL:SQLI
19a40 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
19a50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
19a60 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
19a70 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
19a80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
19a90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
19aa0 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
19ab0 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
19ac0 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
19ad0 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
19ae0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
19af0 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
19b00 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
19b10 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
19b20 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
19b30 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
19b40 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
19b50 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
19b60 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
19b70 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
19b80 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
19b90 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
19ba0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
19bb0 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75  nto *pFile. Retu
19bc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
19bd0 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73  success .** or s
19be0 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
19bf0 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
19c00 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
19c10 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64  omatically .** d
19c20 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
19c30 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
19c40 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
19c50 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73  * The flags pass
19c60 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61  ed to the VFS la
19c70 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c  yer xOpen() call
19c80 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69   are those speci
19c90 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d  fied.** by param
19ca0 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52  eter vfsFlags OR
19cb0 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ed with the foll
19cc0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
19cd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
19ce0 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51  DWRITE.**     SQ
19cf0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
19d00 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
19d10 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  PEN_EXCLUSIVE.**
19d20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
19d30 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a  _DELETEONCLOSE.*
19d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
19d50 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
19d60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
19d70 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
19d80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
19d90 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
19da0 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
19db0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19dc0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
19dd0 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
19de0 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
19df0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
19e00 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
19e10 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
19e20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
19e30 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
19e40 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
19e50 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
19e60 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
19e70 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
19e80 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
19e90 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
19ea0 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |=  SQLITE_OPEN_
19eb0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
19ec0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
19ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
19ee0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
19ef0 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE | SQLITE_OPEN
19f00 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
19f10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19f20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
19f30 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73  s, 0, pFile, vfs
19f40 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73  Flags, 0);.  ass
19f50 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
19f60 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69  OK || isOpen(pFi
19f70 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  le) );.  return 
19f80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
19f90 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
19fa0 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  r function..**.*
19fb0 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f  * The pager invo
19fc0 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e  kes the busy-han
19fd0 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f  dler if sqlite3O
19fe0 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20  sLock() returns 
19ff0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
1a000 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
1a010 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c  pgrade from no-l
1a020 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20  ock to a SHARED 
1a030 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e  lock,.** or when
1a040 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
1a050 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
1a060 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58  ED lock to an EX
1a070 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b  CLUSIVE .** lock
1a080 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20  . It does *not* 
1a090 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
1a0a0 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67  handler when upg
1a0b0 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53  rading from.** S
1a0c0 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
1a0d0 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61  D, or when upgra
1a0e0 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44  ding from SHARED
1a0f0 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   to EXCLUSIVE.**
1a100 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64   (which occurs d
1a110 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
1a120 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d  l rollback). Sum
1a130 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72  mary:.**.**   Tr
1a140 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20  ansition        
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48  | Invokes xBusyH
1a170 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d  andler.**   ----
1a180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a1a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a1b0 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  ----.**   NO_LOC
1a1c0 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45  K       -> SHARE
1a1d0 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65  D_LOCK      | Ye
1a1e0 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  s.**   SHARED_LO
1a1f0 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44  CK   -> RESERVED
1a200 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a  _LOCK    | No.**
1a210 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
1a220 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
1a230 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52  CK   | No.**   R
1a240 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20  ESERVED_LOCK -> 
1a250 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
1a260 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20   | Yes.**.** If 
1a270 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
1a280 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
1a290 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
1a2a0 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72  lock is .** retr
1a2b0 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72  ied. If it retur
1a2c0 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  ns zero, then th
1a2d0 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  e SQLITE_BUSY er
1a2e0 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ror is.** return
1a2f0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
1a300 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50   of the pager AP
1a310 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  I function..*/.v
1a320 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1a330 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a  SetBusyhandler(.
1a340 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1a370 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1a380 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
1a390 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20  void *),        
1a3a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
1a3b0 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
1a3c0 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
1a3d0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a3f0 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  * Argument to pa
1a400 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c  ss to xBusyHandl
1a410 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61  er */.){  .  pPa
1a420 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
1a430 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72  r = xBusyHandler
1a440 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
1a450 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42  yHandlerArg = pB
1a460 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d  usyHandlerArg;.}
1a470 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74  ../*.** Report t
1a480 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1a490 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  size and number 
1a4a0 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
1a4b0 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  s back.** to the
1a4c0 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65   codec..*/.#ifde
1a4d0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
1a4e0 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  EC.static void p
1a4f0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50  agerReportSize(P
1a500 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1a510 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
1a520 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20  decSizeChng ){. 
1a530 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65     pPager->xCode
1a540 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72  cSizeChng(pPager
1a550 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72  ->pCodec, pPager
1a560 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a580 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67         (int)pPag
1a590 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20  er->nReserve);. 
1a5a0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
1a5b0 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53  ine pagerReportS
1a5c0 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f  ize(X)     /* No
1a5d0 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74  -op if we do not
1a5e0 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63   support a codec
1a5f0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
1a600 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
1a610 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
1a620 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
1a630 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
1a640 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
1a650 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
1a660 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
1a670 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
1a680 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
1a690 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1a6a0 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
1a6b0 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
1a6c0 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
1a6d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
1a6e0 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
1a6f0 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
1a700 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
1a710 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54  CORRUPT or SQLIT
1a720 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f  E_FULL)..**.** O
1a730 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
1a740 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1a750 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1a760 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61  *   * the new pa
1a770 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f  ge size (value o
1a780 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73  f *pPageSize) is
1a790 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20   valid (a power 
1a7a0 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62  .**     of two b
1a7b0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53  etween 512 and S
1a7c0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
1a7d0 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c  IZE, inclusive),
1a7e0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
1a7f0 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
1a800 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
1a810 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a  erences, and.**.
1a820 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
1a830 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f  ase is either no
1a840 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
1a850 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73  atabase or it is
1a860 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65  .**     an in-me
1a870 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68  mory database th
1a880 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  at currently con
1a890 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61  sists of zero pa
1a8a0 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  ges..**.** then 
1a8b0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
1a8c0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
1a8d0 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  t to *pPageSize.
1a8e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1a8f0 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67  ge size is chang
1a900 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ed, then this fu
1a910 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69  nction uses sqli
1a920 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29  te3PagerMalloc()
1a930 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61   .** to obtain a
1a940 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53   new Pager.pTmpS
1a950 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20  pace buffer. If 
1a960 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
1a970 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c  attempt .** fail
1a980 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
1a990 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1a9a0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65  the page size re
1a9b0 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e  mains unchanged.
1a9c0 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65   .** In all othe
1a9d0 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f  r cases, SQLITE_
1a9e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1a9f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
1aa00 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68  e size is not ch
1aa10 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65  anged, either be
1aa20 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65  cause one of the
1aa30 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63   enumerated.** c
1aa40 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
1aa50 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65  is not true, the
1aa60 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72   pager was in er
1aa70 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
1aa80 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
1aa90 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62  was called, or b
1aaa0 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72  ecause the memor
1aab0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  y allocation att
1aac0 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a  empt failed, .**
1aad0 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65   then *pPageSize
1aae0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
1aaf0 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67  ld, retained pag
1ab00 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65  e size before re
1ab10 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
1ab20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
1ab30 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
1ab40 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67  Pager, u16 *pPag
1ab50 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
1ab60 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
1ab70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ab80 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1ab90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31  ITE_OK ){.    u1
1aba0 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  6 pageSize = *pP
1abb0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73  ageSize;.    ass
1abc0 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
1abd0 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
1abe0 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
1abf0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
1ac00 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28  SIZE) );.    if(
1ac10 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
1ac20 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
1ac30 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26  Size==0).     &&
1ac40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
1ac50 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
1ac60 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20  PCache)==0 .    
1ac70 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20   && pageSize && 
1ac80 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72  pageSize!=pPager
1ac90 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20  ->pageSize .    
1aca0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
1acb0 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
1acc0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
1acd0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1ace0 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
1acf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ad00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
1ad10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 61  else{.        pa
1ad20 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1ad30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
1ad40 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
1ad50 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
1ad60 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
1ad70 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1ad80 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  e);.        pPag
1ad90 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
1ada0 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71  pNew;.        sq
1adb0 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61  lite3PcacheSetPa
1adc0 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  geSize(pPager->p
1add0 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65  PCache, pageSize
1ade0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1adf0 0a 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20  .    *pPageSize 
1ae00 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 70  = (u16)pPager->p
1ae10 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 66 28  ageSize;.    if(
1ae20 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52   nReserve<0 ) nR
1ae30 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d  eserve = pPager-
1ae40 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61  >nReserve;.    a
1ae50 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
1ae60 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31  =0 && nReserve<1
1ae70 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  000 );.    pPage
1ae80 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69  r->nReserve = (i
1ae90 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  16)nReserve;.   
1aea0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
1aeb0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1aec0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1aed0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1aee0 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
1aef0 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
1af00 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
1af10 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
1af20 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
1af30 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
1af40 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
1af50 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
1af60 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
1af70 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
1af80 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
1af90 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
1afa0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
1afb0 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
1afc0 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
1afd0 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
1afe0 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
1aff0 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
1b000 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
1b010 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
1b020 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
1b030 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
1b040 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
1b050 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
1b060 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1b070 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
1b080 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
1b090 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
1b0a0 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
1b0b0 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
1b0c0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
1b0d0 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
1b0e0 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
1b0f0 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
1b100 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
1b110 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
1b120 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
1b130 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
1b140 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
1b150 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
1b160 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
1b170 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
1b180 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
1b190 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
1b1a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1b1b0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
1b1c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1b1d0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
1b1e0 20 6e 50 61 67 65 3b 0a 20 20 69 66 28 20 6d 78   nPage;.  if( mx
1b1f0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
1b200 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
1b210 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28  xPage;.  }.  if(
1b220 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1b230 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
1b240 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1b250 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1b260 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 61  , &nPage);.    a
1b270 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
1b280 78 50 67 6e 6f 3e 3d 6e 50 61 67 65 20 29 3b 0a  xPgno>=nPage );.
1b290 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
1b2a0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
1b2b0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1b2c0 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
1b2d0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
1b2e0 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
1b2f0 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
1b300 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
1b310 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
1b320 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
1b330 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
1b340 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
1b350 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
1b360 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
1b370 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
1b380 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
1b390 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
1b3a0 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
1b3b0 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
1b3c0 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
1b3d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1b3e0 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
1b3f0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1b400 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
1b410 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
1b420 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
1b430 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
1b440 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
1b450 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
1b460 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
1b470 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
1b480 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
1b490 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
1b4a0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
1b4b0 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
1b4c0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1b4d0 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
1b4e0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
1b4f0 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
1b500 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1b510 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
1b520 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
1b530 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
1b540 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
1b550 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
1b560 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
1b570 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
1b580 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1b590 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
1b5a0 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
1b5b0 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
1b5c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1b5d0 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  ger was opened o
1b5e0 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  n a transient fi
1b5f0 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22  le (zFilename=="
1b600 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64  "), or.** opened
1b610 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20   on a file less 
1b620 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20  than N bytes in 
1b630 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74  size, the output
1b640 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65   buffer is.** ze
1b650 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  roed and SQLITE_
1b660 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
1b670 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74   rationale for t
1b680 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
1b690 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
1b6a0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61   used to read da
1b6b0 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20  tabase headers, 
1b6c0 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69  and a new transi
1b6d0 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73  ent or.** zero s
1b6e0 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ized database ha
1b6f0 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20  s a header than 
1b700 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
1b710 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a  y of zeroes..**.
1b720 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72  ** If any IO err
1b730 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51  or apart from SQ
1b740 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1b750 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74  _READ is encount
1b760 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  ered,.** the err
1b770 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1b780 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
1b790 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  r and the conten
1b7a0 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ts of the.** out
1b7b0 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66  put buffer undef
1b7c0 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ined..*/.int sql
1b7d0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
1b7e0 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
1b7f0 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
1b800 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
1b810 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
1b820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
1b830 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
1b840 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1b850 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1b860 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1b870 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  le );..  /* This
1b880 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
1b890 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65   called by btree
1b8a0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
1b8b0 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  er creating.  **
1b8c0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
1b8d0 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f  t.  There has no
1b8e0 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74  t been an opport
1b8f0 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74  unity to transit
1b900 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20  ion.  ** to WAL 
1b910 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  mode yet..  */. 
1b920 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
1b930 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
1b940 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 61 67  .#if 0.  if( pag
1b950 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1b960 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 6e   ){.    int isIn
1b970 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Wal = 0;.    rc 
1b980 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1b990 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
1b9a0 2c 20 26 69 73 49 6e 57 61 6c 2c 20 4e 2c 20 70  , &isInWal, N, p
1b9b0 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Dest);.    if( r
1b9c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1b9d0 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 20  isInWal ){.     
1b9e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b9f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1ba00 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1ba10 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
1ba20 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
1ba30 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
1ba40 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
1ba50 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1ba60 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
1ba70 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
1ba80 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1ba90 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1baa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bab0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1bac0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bad0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
1bae0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1baf0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1bb00 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69  base file associ
1bb10 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50  ated .** with pP
1bb20 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ager. Normally, 
1bb30 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74  this is calculat
1bb40 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20  ed as (<db file 
1bb50 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65  size>/<page-size
1bb60 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  >)..** However, 
1bb70 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62  if the file is b
1bb80 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61  etween 1 and <pa
1bb90 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69  ge-size> bytes i
1bba0 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a  n size, then .**
1bbb0 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65   this is conside
1bbc0 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c  red a 1 page fil
1bbd0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1bbe0 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f  pager is in erro
1bbf0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
1bc00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1bc10 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a  lled, then the.*
1bc20 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  * error state er
1bc30 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1bc40 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65  rned and *pnPage
1bc50 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
1bc60 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66   Or,.** if the f
1bc70 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73 20 74  ile system has t
1bc80 6f 20 62 65 20 71 75 65 72 69 65 64 20 66 6f 72  o be queried for
1bc90 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1bca0 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65   file and.** the
1bcb0 20 71 75 65 72 79 20 61 74 74 65 6d 70 74 20 72   query attempt r
1bcc0 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72  eturns an IO err
1bcd0 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  or, the IO error
1bce0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1bcf0 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65  d.** and *pnPage
1bd00 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
1bd10 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ed..**.** Otherw
1bd20 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69  ise, if everythi
1bd30 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
1bd40 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
1bd50 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
1bd60 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73  and *pnPage is s
1bd70 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1bd80 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1bd90 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
1bda0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
1bdb0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1bdc0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
1bdd0 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1bde0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1bdf0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1be00 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
1be10 2a 2f 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69  */..  /* Determi
1be20 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ne the number of
1be30 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
1be40 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69  le. Store this i
1be50 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66  n nPage. */.  if
1be60 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1be70 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61  Valid ){.    nPa
1be80 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ge = pPager->dbS
1be90 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ize;.  }else{.  
1bea0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1beb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
1bec0 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  or returned by O
1bed0 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20  sFileSize() */. 
1bee0 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20     i64 n = 0;   
1bef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1bf00 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  le size in bytes
1bf10 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46   returned by OsF
1bf20 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20  ileSize() */..  
1bf30 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
1bf40 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
1bf50 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1bf60 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
1bf70 20 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69    sqlite3WalDbsi
1bf80 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  ze(pPager->pWal,
1bf90 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a   &nPage);.    }.
1bfa0 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
1bfb0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1bfc0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1bfd0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1bfe0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1bff0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
1c000 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1c010 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
1c020 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
1c030 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1c040 65 72 2d 3e 66 64 2c 20 26 6e 29 29 20 29 7b 0a  er->fd, &n)) ){.
1c050 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
1c060 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1c070 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1c080 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1c090 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1c0a0 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
1c0b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
1c0c0 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d  .        nPage =
1c0d0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
1c0e0 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d  .        nPage =
1c0f0 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67   (Pgno)(n / pPag
1c100 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c110 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c120 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1c130 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1c140 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1c150 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
1c160 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1c170 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
1c180 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ge;.      pPager
1c190 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
1c1a0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1c1b0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1c1c0 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1c1d0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1c1e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1c1f0 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  e .  ** configur
1c200 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
1c210 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
1c220 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
1c230 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
1c240 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
1c250 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
1c260 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
1c270 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
1c280 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
1c290 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
1c2a0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
1c2b0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e  tput variable an
1c2c0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1c2d0 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50 61 67 65 20  OK */.  *pnPage 
1c2e0 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1c2f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c300 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
1c310 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
1c320 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
1c330 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c340 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
1c350 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
1c360 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
1c370 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
1c380 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
1c390 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
1c3a0 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
1c3b0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
1c3c0 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
1c3d0 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
1c3e0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
1c3f0 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
1c400 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
1c410 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
1c420 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
1c430 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
1c440 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
1c450 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
1c460 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
1c470 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
1c480 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
1c490 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
1c4a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1c4b0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1c4c0 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
1c4d0 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
1c4e0 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
1c4f0 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
1c500 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
1c510 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
1c520 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
1c530 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
1c540 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
1c550 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1c560 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1c570 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
1c580 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1c590 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
1c5a0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1c5d0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53   */..  /* The OS
1c5e0 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73   lock values mus
1c5f0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
1c600 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20   the Pager lock 
1c610 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65  values */.  asse
1c620 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
1c630 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
1c640 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
1c650 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
1c660 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
1c670 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
1c680 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
1c690 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
1c6a0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75  f the file is cu
1c6b0 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
1c6c0 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d   then the size m
1c6d0 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 2e 20  ust be unknown. 
1c6e0 49 74 0a 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74  It.  ** must not
1c6f0 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
1c700 69 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ied at this poin
1c710 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
1c720 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1c730 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
1c740 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
1c750 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73  alid==0 );.  ass
1c760 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1c770 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1c780 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f   || pPager->dbMo
1c790 64 69 66 69 65 64 3d 3d 30 20 29 3b 0a 0a 20 20  dified==0 );..  
1c7a0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
1c7b0 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
1c7c0 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
1c7d0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
1c7e0 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
1c7f0 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
1c800 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
1c810 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
1c820 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
1c830 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
1c840 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
1c850 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
1c860 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
1c870 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
1c880 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
1c890 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73  sert( (pPager->s
1c8a0 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  tate>=locktype).
1c8b0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
1c8c0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1c8d0 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  UNLOCK && lockty
1c8e0 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  pe==PAGER_SHARED
1c8f0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
1c900 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1c910 52 5f 52 45 53 45 52 56 45 44 20 26 26 20 6c 6f  R_RESERVED && lo
1c920 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 45 58  cktype==PAGER_EX
1c930 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20  CLUSIVE).  );.. 
1c940 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1c950 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
1c960 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c970 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
1c980 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
1c990 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1c9a0 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
1c9b0 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
1c9c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
1c9d0 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
1c9e0 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
1c9f0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
1ca00 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  g) );.    if( rc
1ca10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ca20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1ca30 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  te = (u8)locktyp
1ca40 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  e;.      IOTRACE
1ca50 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
1ca60 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  , pPager, lockty
1ca70 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pe)).    }.  }. 
1ca80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ca90 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73  *.** Function as
1caa0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
1cab0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63  traint(pPager) c
1cac0 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f  hecks that one o
1cad0 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
1cae0 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20  ing is true for 
1caf0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
1cb00 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
1cb10 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a   page-cache:.**.
1cb20 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65  **   a) The page
1cb30 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
1cb40 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1cb50 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1cb60 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e   .**      curren
1cb70 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  t database image
1cb80 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a  , in pages, OR.*
1cb90 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65  *.**   b) if the
1cba0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65   page content we
1cbb0 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68  re written at th
1cbc0 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c  is time, it woul
1cbd0 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65  d not.**      be
1cbe0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
1cbf0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
1cc00 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74  content out to t
1cc10 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
1cc20 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72  *      (as deter
1cc30 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f  mined by functio
1cc40 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  n subjRequiresPa
1cc50 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ge())..**.** If 
1cc60 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73  the condition as
1cc70 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66  serted by this f
1cc80 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  unction were not
1cc90 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a   true, and the.*
1cca0 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72  * dirty page wer
1ccb0 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  e to be discarde
1ccc0 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
1ccd0 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74   via the pagerSt
1cce0 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  ress().** routin
1ccf0 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29  e, pagerStress()
1cd00 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65   would not write
1cd10 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1cd20 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20  e content to.** 
1cd30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cd40 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e  e. If a savepoin
1cd50 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65  t transaction we
1cd60 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  re rolled back a
1cd70 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70  fter.** this hap
1cd80 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65  pened, the corre
1cd90 63 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75  ct behaviour wou
1cda0 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
1cdb0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1cdc0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
1cdd0 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
1cde0 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
1cdf0 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
1ce00 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
1ce10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
1ce20 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
1ce30 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1ce40 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
1ce50 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
1ce60 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
1ce70 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
1ce80 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
1ce90 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
1cea0 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
1ceb0 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
1cec0 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
1ced0 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
1cee0 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
1cef0 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
1cf00 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1cf10 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
1cf20 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
1cf30 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
1cf40 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
1cf50 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
1cf60 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
1cf70 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
1cf80 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
1cf90 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
1cfa0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
1cfb0 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
1cfc0 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
1cfd0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
1cfe0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
1cff0 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
1d000 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
1d010 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
1d020 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
1d030 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
1d040 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
1d050 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
1d060 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
1d070 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
1d080 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
1d090 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
1d0a0 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
1d0b0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
1d0c0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
1d0d0 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
1d0e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
1d0f0 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
1d100 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
1d110 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
1d120 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
1d130 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
1d140 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
1d150 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
1d160 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1d170 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
1d180 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1d190 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
1d1a0 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
1d1b0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
1d1c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1d1d0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
1d1e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1d1f0 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
1d200 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1d210 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1d220 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1d230 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1d240 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65   = nPage;.  asse
1d250 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
1d260 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  aint(pPager);.}.
1d270 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d280 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1d290 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1d2a0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
1d2b0 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
1d2c0 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
1d2d0 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
1d2e0 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
1d2f0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
1d300 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
1d310 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1d320 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
1d330 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
1d340 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
1d350 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
1d360 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
1d370 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
1d380 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
1d390 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
1d3a0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1d3b0 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
1d3c0 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
1d3d0 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
1d3e0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
1d3f0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
1d400 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
1d410 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
1d420 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
1d430 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
1d440 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
1d450 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
1d460 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
1d470 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
1d480 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
1d490 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
1d4a0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1d4b0 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
1d4c0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1d4d0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
1d4e0 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
1d4f0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1d500 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
1d510 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1d520 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
1d530 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
1d540 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1d550 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
1d560 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
1d570 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1d580 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1d590 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1d5a0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1d5b0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
1d5c0 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
1d5d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d5e0 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
1d5f0 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
1d600 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
1d610 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
1d620 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
1d630 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
1d640 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
1d650 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1d660 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
1d670 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1d680 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
1d690 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
1d6a0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
1d6b0 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
1d6c0 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
1d6d0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
1d6e0 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
1d6f0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
1d700 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
1d710 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1d720 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
1d730 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
1d740 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
1d750 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d760 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
1d770 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
1d780 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
1d790 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
1d7a0 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
1d7b0 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
1d7c0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
1d7d0 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
1d7e0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
1d7f0 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
1d800 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
1d810 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
1d820 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
1d830 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
1d840 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
1d850 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1d860 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20   u8 *pTmp = (u8 
1d870 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
1d880 61 63 65 3b 0a 0a 20 20 64 69 73 61 62 6c 65 5f  ace;..  disable_
1d890 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
1d8a0 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ors();.  sqlite3
1d8b0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
1d8c0 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  c();.  pPager->e
1d8d0 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
1d8e0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1d8f0 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
1d900 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1d910 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f  .  sqlite3WalClo
1d920 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  se(pPager->pWal,
1d930 0a 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f  .    (pPager->no
1d940 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61 67 65  Sync ? 0 : pPage
1d950 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c 20  r->sync_flags), 
1d960 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67  .    pPager->pag
1d970 65 53 69 7a 65 2c 20 70 54 6d 70 0a 20 20 29 3b  eSize, pTmp.  );
1d980 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  .  pPager->pWal 
1d990 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61  = 0;.#endif.  pa
1d9a0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1d9b0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1d9c0 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
1d9d0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  ck(pPager);.  }e
1d9e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20  lse{.    /* Set 
1d9f0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72  Pager.journalHdr
1da00 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62   to -1 for the b
1da10 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70 61  enefit of the pa
1da20 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a  ger_playback() .
1da30 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63      ** call whic
1da40 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72  h may be made fr
1da50 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 55  om within pagerU
1da60 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
1da70 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a  (). If it.    **
1da80 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e   is not -1, then
1da90 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f   the unsynced po
1daa0 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e  rtion of an open
1dab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
1dac0 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79  y.    ** be play
1dad0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
1dae0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
1daf0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
1db00 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a  curs while.    *
1db10 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
1db20 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
1db30 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72  e may become cor
1db40 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rupt..    */.   
1db50 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1db60 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
1db70 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1db80 65 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  e = pagerSyncHot
1db90 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1dba0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
1dbb0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
1dbc0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
1dbd0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
1dbe0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
1dbf0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
1dc00 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
1dc10 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
1dc20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1dc30 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
1dc40 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
1dc50 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
1dc60 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
1dc70 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
1dc80 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
1dc90 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
1dca0 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
1dcb0 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
1dcc0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
1dcd0 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
1dce0 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
1dcf0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
1dd00 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
1dd10 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
1dd20 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
1dd30 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
1dd40 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
1dd50 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
1dd60 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
1dd70 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
1dd80 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
1dd90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
1dda0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
1ddb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1ddc0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
1ddd0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1dde0 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
1ddf0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
1de00 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
1de10 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
1de20 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
1de30 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
1de40 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
1de50 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
1de60 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
1de70 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
1de80 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
1de90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dea0 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
1deb0 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
1dec0 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
1ded0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1dee0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
1def0 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
1df00 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
1df10 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
1df20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1df30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
1df40 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
1df50 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
1df60 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
1df70 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
1df80 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
1df90 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
1dfa0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
1dfb0 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  If the Pager.nee
1dfc0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f  dSync flag is no
1dfd0 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  t set, then this
1dfe0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a   function is a.*
1dff0 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  * no-op. Otherwi
1e000 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20  se, the actions 
1e010 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20  required depend 
1e020 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  on the journal-m
1e030 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ode.** and the d
1e040 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
1e050 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65  stics of the the
1e060 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
1e070 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1e080 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
1e090 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
1e0a0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
1e0b0 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
1e0c0 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
1e0d0 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
1e0e0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1e0f0 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
1e100 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
1e110 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
1e120 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
1e130 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
1e140 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
1e150 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
1e160 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
1e170 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
1e180 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
1e190 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
1e1a0 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
1e1b0 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
1e1c0 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
1e1d0 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
1e1e0 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
1e1f0 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
1e200 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
1e210 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
1e220 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
1e230 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
1e240 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
1e250 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
1e260 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
1e270 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
1e280 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
1e290 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
1e2a0 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
1e2b0 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
1e2c0 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
1e2d0 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
1e2e0 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
1e2f0 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
1e300 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
1e310 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
1e320 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
1e330 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
1e340 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
1e350 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
1e360 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
1e370 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
1e380 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
1e390 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
1e3a0 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65  }.**.** The Page
1e3b0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
1e3c0 69 73 20 6e 65 76 65 72 20 62 65 20 73 65 74 20  is never be set 
1e3d0 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1e3e0 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66  les, or any.** f
1e3f0 69 6c 65 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  ile operating in
1e400 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50   no-sync mode (P
1e410 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20  ager.noSync set 
1e420 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a  to non-zero)..**
1e430 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1e440 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
1e450 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52  clears the PGHDR
1e460 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
1e470 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67  of every .** pag
1e480 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  e currently held
1e490 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72   in memory befor
1e4a0 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  e returning SQLI
1e4b0 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a  TE_OK. If an IO.
1e4c0 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ** error is enco
1e4d0 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68  untered, then th
1e4e0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
1e4f0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1e500 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
1e510 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
1e520 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1e530 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
1e540 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
1e550 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
1e560 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1e570 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1e580 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
1e590 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
1e5a0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69  EMORY ){.      i
1e5b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e5e0 64 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  de */.      cons
1e5f0 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69  t int iDc = sqli
1e600 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1e610 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1e620 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
1e630 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1e640 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
1e650 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
1e660 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1e670 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
1e680 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
1e690 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e  ck deals with an
1e6a0 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d   obscure problem
1e6b0 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f  . If the last co
1e6c0 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nnection.       
1e6d0 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74   ** that wrote t
1e6e0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
1e6f0 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  was operating in
1e700 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72   persistent-jour
1e710 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  nal.        ** m
1e720 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
1e730 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61  urnal file may a
1e740 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74  t this point act
1e750 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a  ually be larger.
1e760 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20          ** than 
1e770 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
1e780 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e   bytes. If the n
1e790 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65  ext thing in the
1e7a0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1e7b0 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73   ** file happens
1e7c0 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c   to be a journal
1e7d0 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e  -header (written
1e7e0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
1e7f0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
1e800 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73  ous connection's
1e810 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61   transaction), a
1e820 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f  nd a crash or po
1e830 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20  wer-failure .   
1e840 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61       ** occurs a
1e850 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64  fter nRec is upd
1e860 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20  ated but before 
1e870 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1e880 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20  writes .        
1e890 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ** anything else
1e8a0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1e8b0 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73  file (or commits
1e8c0 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20  /rolls back its 
1e8d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
1e8e0 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53  saction), then S
1e8f0 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65  QLite may become
1e900 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64   confused when d
1e910 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  oing the .      
1e920 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
1e930 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
1e940 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74  ing recovery. It
1e950 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61   may roll back a
1e960 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ll.        ** of
1e970 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1e980 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f  s data, then pro
1e990 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20  ceed to rolling 
1e9a0 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20  back the old,.  
1e9b0 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d        ** out-of-
1e9c0 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66  date data that f
1e9d0 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62  ollows it. Datab
1e9e0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1e9f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1ea00 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72     ** To work ar
1ea10 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68  ound this, if th
1ea20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
1ea30 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f  oes appear to co
1ea40 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ntain.        **
1ea50 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20   a valid header 
1ea60 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e  following Pager.
1ea70 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e  journalOff, then
1ea80 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20   write a 0x00.  
1ea90 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f        ** byte to
1eaa0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
1eab0 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66   to prevent it f
1eac0 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e  rom being recogn
1ead0 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ized..        **
1eae0 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69  .        ** Vari
1eaf0 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66  able iNextHdrOff
1eb00 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
1eb10 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63  e offset at whic
1eb20 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  h this.        *
1eb30 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65  * problematic he
1eb40 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c  ader will occur,
1eb50 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61   if it exists. a
1eb60 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20  Magic is used . 
1eb70 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74         ** as a t
1eb80 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
1eb90 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66  to inspect the f
1eba0 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62  irst couple of b
1ebb0 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20  ytes of.        
1ebc0 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c  ** the potential
1ebd0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
1ebe0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1ebf0 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72      i64 iNextHdr
1ec00 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
1ec10 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20  u8 aMagic[8];.  
1ec20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72        u8 zHeader
1ec30 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
1ec40 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20  Magic)+4];..    
1ec50 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64      memcpy(zHead
1ec60 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
1ec70 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
1ec80 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
1ec90 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
1eca0 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
1ecb0 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50  urnalMagic)], pP
1ecc0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
1ecd0 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66        iNextHdrOf
1ece0 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  fset = journalHd
1ecf0 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
1ed00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1ed10 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1ed20 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
1ed30 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   8, iNextHdrOffs
1ed40 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  et);.        if(
1ed50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ed60 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67  & 0==memcmp(aMag
1ed70 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
1ed80 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 8) ){.       
1ed90 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1eda0 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b  u8 zerobyte = 0;
1edb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1edc0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1edd0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72  Pager->jfd, &zer
1ede0 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48  obyte, 1, iNextH
1edf0 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
1ee00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1ee10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1ee20 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1ee30 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1ee40 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1ee50 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1ee60 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
1ee70 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1ee80 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1ee90 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
1eea0 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
1eeb0 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
1eec0 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
1eed0 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
1eee0 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
1eef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
1ef00 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
1ef10 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
1ef20 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
1ef30 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
1ef40 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
1ef50 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
1ef60 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
1ef70 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
1ef80 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1ef90 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
1efa0 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
1efb0 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
1efc0 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
1efd0 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
1efe0 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
1eff0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1f000 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
1f010 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
1f020 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
1f030 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
1f040 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
1f050 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
1f060 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
1f070 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
1f080 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
1f090 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
1f0a0 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
1f0b0 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
1f0c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f0d0 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
1f0e0 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
1f0f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1f100 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
1f110 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1f120 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1f130 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1f140 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1f150 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1f160 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1f170 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
1f180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1f190 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
1f1a0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
1f1b0 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
1f1c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f1d0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1f1e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f1f0 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
1f200 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67  %p %lld\n", pPag
1f210 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
1f220 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20  nalHdr));.      
1f230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1f240 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20  Write(.         
1f250 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20     pPager->jfd, 
1f260 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
1f270 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72  zHeader), pPager
1f280 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
1f290 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1f2a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f2b0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1f2c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f2d0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1f2e0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1f2f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47  ) ){.        PAG
1f300 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
1f310 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
1f320 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1f330 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
1f340 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
1f350 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1f360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f370 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
1f380 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
1f390 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  _flags| .       
1f3a0 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
1f3b0 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  _flags==SQLITE_S
1f3c0 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
1f3d0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
1f3e0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1f3f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f400 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1f410 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1f420 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75  ..    /* The jou
1f430 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
1f440 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  st successfully 
1f450 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65  synced. Set Page
1f460 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  r.needSync .    
1f470 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63  ** to zero and c
1f480 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
1f490 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e  EED_SYNC flag on
1f4a0 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20   all pagess..   
1f4b0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1f4c0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1f4d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1f4e0 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
1f4f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1f500 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
1f510 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 73  ournalOff;.    s
1f520 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
1f530 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65  rSyncFlags(pPage
1f540 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d  r->pPCache);.  }
1f550 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1f560 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1f570 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
1f580 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
1f590 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
1f5a0 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
1f5b0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
1f5c0 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
1f5d0 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
1f5e0 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
1f5f0 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
1f600 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
1f610 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
1f620 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
1f630 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
1f640 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
1f650 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
1f660 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
1f670 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
1f680 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
1f690 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
1f6a0 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
1f6b0 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
1f6c0 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
1f6d0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
1f6e0 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
1f6f0 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
1f700 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f710 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
1f720 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
1f730 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1f740 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
1f750 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
1f760 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
1f770 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1f780 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
1f790 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
1f7a0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
1f7b0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
1f7c0 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
1f7d0 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
1f7e0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
1f7f0 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
1f800 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
1f810 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
1f820 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
1f830 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
1f840 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
1f850 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
1f860 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
1f870 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
1f880 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
1f890 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
1f8a0 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
1f8b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1f8c0 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
1f8d0 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
1f8e0 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
1f8f0 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
1f900 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1f910 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
1f920 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
1f930 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1f940 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
1f950 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
1f960 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
1f970 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
1f980 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
1f990 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
1f9a0 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
1f9b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1f9c0 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
1f9d0 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
1f9e0 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
1f9f0 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
1fa00 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
1fa10 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
1fa20 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
1fa30 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
1fa40 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
1fa50 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
1fa60 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
1fa70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1fa80 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
1fa90 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
1faa0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1fab0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
1fac0 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
1fad0 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
1fae0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1faf0 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
1fb00 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
1fb10 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
1fb20 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
1fb30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1fb40 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
1fb50 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67  rite_pagelist(Pg
1fb60 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50  Hdr *pList){.  P
1fb70 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1fba0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ect */.  int rc;
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fbd0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1fbe0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 69  .  if( NEVER(pLi
1fbf0 73 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  st==0) ) return 
1fc00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
1fc10 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
1fc20 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
1fc30 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
1fc40 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
1fc50 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
1fc60 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1fc70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
1fc80 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
1fc90 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
1fca0 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
1fcb0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
1fcc0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
1fcd0 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
1fce0 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
1fcf0 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
1fd00 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
1fd10 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
1fd20 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
1fd30 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
1fd40 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
1fd50 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
1fd60 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
1fd70 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
1fd80 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1fd90 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
1fda0 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
1fdb0 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
1fdc0 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
1fdd0 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
1fde0 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
1fdf0 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
1fe00 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
1fe10 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
1fe20 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
1fe30 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
1fe40 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
1fe50 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
1fe60 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
1fe70 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
1fe80 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
1fe90 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
1fea0 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
1feb0 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
1fec0 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
1fed0 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
1fee0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
1fef0 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
1ff00 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
1ff10 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
1ff20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1ff30 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
1ff40 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
1ff50 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
1ff60 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
1ff70 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
1ff80 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
1ff90 70 61 67 65 72 55 73 65 57 61 6c 28 70 4c 69 73  pagerUseWal(pLis
1ffa0 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20  t->pPager) );.  
1ffb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ffc0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
1ffd0 45 52 56 45 44 20 29 3b 0a 20 20 72 63 20 3d 20  ERVED );.  rc = 
1ffe0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
1fff0 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
20000 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f  SIVE_LOCK);..  /
20010 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
20020 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73   a temp-file has
20030 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
20040 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
20050 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f  w. It.  ** is no
20060 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  t possible for r
20070 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68  c to be other th
20080 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  an SQLITE_OK if 
20090 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
200a0 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61   is taken, as pa
200b0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
200c0 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
200d0 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20  r temp-files..  
200e0 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
200f0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
20100 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20110 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
20120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
20130 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
20140 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
20150 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
20160 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
20170 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
20180 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c  the first write,
20190 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20   give the VFS a 
201a0 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65  hint of what the
201b0 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65   final.  ** file
201c0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20   size will be.. 
201d0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
201e0 2d 3e 64 62 53 69 7a 65 20 3e 20 28 70 50 61 67  ->dbSize > (pPag
201f0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2b 31  er->dbOrigSize+1
20200 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  ) && isOpen(pPag
20210 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 73  er->fd) ){.    s
20220 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46  qlite3_int64 szF
20230 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ile = pPager->pa
20240 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
20250 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e  3_int64)pPager->
20260 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  dbSize;.    sqli
20270 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
20280 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
20290 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
202a0 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20  INT, &szFile);. 
202b0 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
202c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
202d0 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
202e0 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
202f0 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
20300 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
20310 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
20320 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
20330 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
20340 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
20350 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
20360 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
20370 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
20380 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
20390 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
203a0 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
203b0 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
203c0 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
203d0 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
203e0 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
203f0 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
20400 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
20410 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
20420 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
20430 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
20440 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
20450 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
20460 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
20470 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
20480 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
20490 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
204a0 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
204b0 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
204c0 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
204d0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
204e0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
204f0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
20500 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
20510 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
20520 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
20550 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
20560 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f   ..      /* Enco
20570 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
20580 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  */.      CODEC2(
20590 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
205a0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72  Data, pgno, 6, r
205b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
205c0 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20  EM, pData);..   
205d0 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20     /* Write out 
205e0 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a  the page data. *
205f0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
20600 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
20610 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
20620 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
20630 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20   offset);..     
20640 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61   /* If page 1 wa
20650 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  s just written, 
20660 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46  update Pager.dbF
20670 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68  ileVers to match
20680 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
20690 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69  lue now stored i
206a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
206b0 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20  ile. If writing 
206c0 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  this .      ** p
206d0 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64  age caused the d
206e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
206f0 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46  grow, update dbF
20700 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20  ileSize. .      
20710 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  */.      if( pgn
20720 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
20730 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
20740 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
20750 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
20760 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
20770 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
20780 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
20790 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
207a0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
207b0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
207c0 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  gno;.      }..  
207d0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e      /* Update an
207e0 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  y backup objects
207f0 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e   copying the con
20800 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
20810 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ger. */.      sq
20820 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
20830 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
20840 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c  p, pgno, (u8*)pL
20850 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20  ist->pData);..  
20860 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
20870 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
20880 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
20890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
208a0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
208b0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
208c0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
208d0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
208e0 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
208f0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
20900 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
20910 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
20920 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
20930 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
20940 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69  NCR(pPager->nWri
20950 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  te);.    }else{.
20960 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
20970 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  (("NOSTORE %d pa
20980 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
20990 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
209a0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
209b0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
209c0 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61  ES.    pList->pa
209d0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
209e0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
209f0 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74  #endif.    pList
20a00 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
20a10 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
20a20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73  rc;.}../*.** Ens
20a30 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62  ure that the sub
20a40 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
20a50 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20   open. If it is 
20a60 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
20a70 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
20a80 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
20a90 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
20aa0 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
20ab0 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
20ac0 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e  ding to plan. An
20ad0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
20ae0 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
20af0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
20b00 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
20b10 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61  3OsOpen() .** fa
20b20 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
20b30 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
20b40 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
20b50 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20b60 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69  ITE_OK;.  if( !i
20b70 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
20b80 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
20b90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
20ba0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
20bb0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
20bc0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
20bd0 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  mory ){.      sq
20be0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
20bf0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
20c00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20c10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
20c20 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
20c30 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
20c40 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
20c50 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
20c60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20c70 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
20c80 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
20c90 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
20ca0 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
20cb0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49  b-journal. .** I
20cc0 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
20cd0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
20ce0 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69  to use subjRequi
20cf0 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65  resPage() to che
20d00 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ck .** that it i
20d10 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  s really require
20d20 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
20d30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
20d40 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
20d50 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
20d60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
20d70 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
20d80 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
20d90 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
20da0 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
20db0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
20dc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
20dd0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
20de0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
20df0 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
20e00 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
20e10 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
20e20 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
20e30 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
20e40 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
20e50 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
20e60 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
20e70 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
20e80 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
20e90 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
20ea0 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
20eb0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
20ec0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20ed0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
20ee0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
20ef0 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  er;.  if( pPager
20f00 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
20f10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20f20 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  _OFF ){..    /* 
20f30 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
20f40 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20  rnal, if it has 
20f50 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
20f60 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61   opened */.    a
20f70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
20f80 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
20f90 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
20fa0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
20fb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20fc0 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  er) );.    asser
20fd0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
20fe0 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  ->sjfd) || pPage
20ff0 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b  r->nSubRec==0 );
21000 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
21010 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21020 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61   .         || pa
21030 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
21040 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50   .         || pP
21050 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
21060 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20  dbOrigSize .    
21070 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  );.    rc = open
21080 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
21090 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  r);..    /* If t
210a0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77  he sub-journal w
210b0 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73  as opened succes
210c0 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61  sfully (or was a
210d0 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20  lready open),.  
210e0 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a    ** write the j
210f0 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e  ournal record in
21100 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f  to the file.  */
21110 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21120 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21130 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
21140 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  g->pData;.      
21150 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61  i64 offset = pPa
21160 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b  ger->nSubRec*(4+
21170 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21180 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  );.      char *p
21190 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20  Data2;.  .      
211a0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
211b0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
211c0 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
211d0 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
211e0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
211f0 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
21200 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
21210 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
21220 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
21230 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
21240 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a  2bits(pPager->sj
21250 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
21260 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
21270 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21280 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21290 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
212a0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
212b0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
212c0 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
212d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
212e0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
212f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
21300 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b  Pager->nSubRec++
21310 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
21320 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
21330 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  >0 );.    rc = a
21340 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
21350 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
21360 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  ->pgno);.  }.  r
21370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21380 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
21390 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
213a0 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77  e pcache layer w
213b0 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68  hen it has reach
213c0 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20  ed some.** soft 
213d0 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68  memory limit. Th
213e0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
213f0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
21400 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a   a Pager object.
21410 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f  ** (cast as a vo
21420 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20  id*). The pager 
21430 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65  is always 'purge
21440 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e  able' (not an in
21450 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
21460 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ase). The second
21470 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72   argument is a r
21480 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61  eference to a pa
21490 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63  ge that is .** c
214a0 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62  urrently dirty b
214b0 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  ut has no outsta
214c0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
214d0 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  . The page.** is
214e0 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74   always associat
214f0 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65  ed with the Page
21500 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
21510 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  as the first .**
21520 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
21530 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
21540 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20   function is to 
21550 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62  make pPg clean b
21560 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f  y writing its co
21570 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f  ntents.** out to
21580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21590 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  le, if possible.
215a0 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76   This may involv
215b0 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a  e syncing the.**
215c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
215d0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
215e0 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63  ful, sqlite3Pcac
215f0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
21600 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70   called on the p
21610 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  age and.** SQLIT
21620 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
21630 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
21640 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
21650 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  g to make the.**
21660 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65   page clean, the
21670 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
21680 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74  s returned. If t
21690 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  he page cannot b
216a0 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20  e.** made clean 
216b0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72  for some other r
216c0 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72  eason, but no er
216d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
216e0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
216f0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
21700 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
21710 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  ean() is not cal
21720 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
21730 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76  nt pagerStress(v
21740 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70  oid *p, PgHdr *p
21750 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
21760 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
21770 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
21780 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
21790 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
217a0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
217b0 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
217c0 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a  PGHDR_DIRTY );..
217d0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
217e0 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  0;.  if( pagerUs
217f0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21800 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
21810 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
21820 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
21830 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28   log. */.    if(
21840 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
21850 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20  e(pPg) ){ .     
21860 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
21870 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20  Page(pPg); .    
21880 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
21890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
218a0 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
218b0 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
218c0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
218d0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
218e0 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20  * The doNotSync 
218f0 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 74  flag is set by t
21900 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  he sqlite3PagerW
21910 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  rite() function 
21920 77 68 69 6c 65 20 69 74 0a 20 20 20 20 2a 2a 20  while it.    ** 
21930 69 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61  is journalling a
21940 20 73 65 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d   set of two or m
21950 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
21960 65 73 20 74 68 61 74 20 61 72 65 20 73 74 6f 72  es that are stor
21970 65 64 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ed.    ** on the
21980 20 73 61 6d 65 20 64 69 73 6b 20 73 65 63 74 6f   same disk secto
21990 72 2e 20 53 79 6e 63 69 6e 67 20 74 68 65 20 6a  r. Syncing the j
219a0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
219b0 6c 6f 77 65 64 20 77 68 69 6c 65 0a 20 20 20 20  lowed while.    
219c0 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
219d0 6e 69 6e 67 20 61 73 20 69 74 20 69 73 20 69 6d  ning as it is im
219e0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c  portant that all
219f0 20 6d 65 6d 62 65 72 73 20 6f 66 20 73 75 63 68   members of such
21a00 20 61 0a 20 20 20 20 2a 2a 20 73 65 74 20 6f 66   a.    ** set of
21a10 20 70 61 67 65 73 20 61 72 65 20 73 79 6e 63 65   pages are synce
21a20 64 20 74 6f 20 64 69 73 6b 20 74 6f 67 65 74 68  d to disk togeth
21a30 65 72 2e 20 53 6f 2c 20 69 66 20 74 68 65 20 70  er. So, if the p
21a40 61 67 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  age this functio
21a50 6e 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 79 69  n.    ** is tryi
21a60 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61 6e  ng to make clean
21a70 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
21a80 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e 64  journal sync and
21a90 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a 20   the doNotSync. 
21aa0 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65     ** flag is se
21ab0 74 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  t, return withou
21ac0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
21ad0 2e 20 54 68 65 20 70 63 61 63 68 65 20 6c 61 79  . The pcache lay
21ae0 65 72 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 6a  er will.    ** j
21af0 75 73 74 20 68 61 76 65 20 74 6f 20 67 6f 20 61  ust have to go a
21b00 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74  head and allocat
21b10 65 20 61 20 6e 65 77 20 70 61 67 65 20 62 75 66  e a new page buf
21b20 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  fer instead of. 
21b30 20 20 20 2a 2a 20 72 65 75 73 69 6e 67 20 70 50     ** reusing pP
21b40 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g..    **.    **
21b50 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74   Similarly, if t
21b60 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
21b70 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
21b80 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
21b90 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 72 79 20   not.    ** try 
21ba0 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e  to write the con
21bb0 74 65 6e 74 73 20 6f 66 20 70 50 67 20 74 6f 20  tents of pPg to 
21bc0 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
21bd0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
21be0 72 2d 3e 65 72 72 43 6f 64 65 29 0a 20 20 20 20  r->errCode).    
21bf0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e   || (pPager->doN
21c00 6f 74 53 79 6e 63 20 26 26 20 70 50 67 2d 3e 66  otSync && pPg->f
21c10 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
21c20 53 59 4e 43 29 0a 20 20 20 20 29 7b 0a 20 20 20  SYNC).    ){.   
21c30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21c40 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  _OK;.    }.  .  
21c50 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
21c60 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
21c70 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
21c80 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
21c90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
21ca0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
21cb0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
21cc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
21cd0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
21ce0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
21cf0 0a 20 20 20 20 20 20 20 20 21 28 70 50 61 67 65  .        !(pPage
21d00 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
21d10 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
21d20 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20  E_MEMORY) &&.   
21d30 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73       !(sqlite3Os
21d40 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
21d50 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
21d60 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
21d70 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20  AFE_APPEND).    
21d80 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61    ){.        pPa
21d90 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
21da0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
21db0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
21dc0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
21dd0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
21de0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
21df0 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20  of this page is 
21e00 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
21e10 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
21e20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
21e30 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61  ase image, it ma
21e40 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69  y need to be wri
21e50 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  tten to the sub-
21e60 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20  journal..    ** 
21e70 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
21e80 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  the call to page
21e90 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
21ea0 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f  () below will no
21eb0 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c  t.    ** actuall
21ec0 79 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20  y write data to 
21ed0 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73  the file in this
21ee0 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   case..    **.  
21ef0 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68    ** Consider th
21f00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75  e following sequ
21f10 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a  ence of events:.
21f20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
21f30 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20  BEGIN;.    **   
21f40 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20    <journal page 
21f50 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d  X>.    **     <m
21f60 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20  odify page X>.  
21f70 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49    **     SAVEPOI
21f80 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20  NT sp;.    **   
21f90 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61      <shrink data
21fa0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70  base file to Y p
21fb0 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ages>.    **    
21fc0 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70     pagerStress(p
21fd0 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20  age X).    **   
21fe0 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70    ROLLBACK TO sp
21ff0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
22000 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77  If (X>Y), then w
22010 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20  hen pagerStress 
22020 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58  is called page X
22030 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69   will not be wri
22040 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20  tten.    ** out 
22050 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
22060 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62  file, but will b
22070 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74  e dropped from t
22080 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a  he cache. Then,.
22090 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
220a0 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
220b0 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c  O sp" statement,
220c0 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20   reading page X 
220d0 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a  will read.    **
220e0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
220f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
22100 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  is will be the c
22110 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73  opy of page X as
22120 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77   it.    ** was w
22130 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
22140 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74  ion started, not
22150 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
22160 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20  "SAVEPOINT sp". 
22170 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74     ** was execut
22180 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
22190 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
221a0 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  s to write the c
221b0 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20  urrent data for 
221c0 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20  page X into the 
221d0 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  .    ** sub-jour
221e0 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66  nal file now (if
221f0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
22200 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68  dy there), so th
22210 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a  at it will.    *
22220 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  * be restored to
22230 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
22240 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ue when the "ROL
22250 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20  LBACK TO sp" is 
22260 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64  .    ** executed
22270 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
22280 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20 20   NEVER(.        
22290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
222a0 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
222b0 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62  r->dbSize && sub
222c0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
222d0 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20  g).    ) ){.    
222e0 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
222f0 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
22300 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74  }.  .    /* Writ
22310 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
22320 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
22330 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
22340 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
22350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22360 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
22370 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
22380 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
22390 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
223a0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
223b0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
223c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
223d0 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
223e0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
223f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
22400 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
22410 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
22420 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
22430 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
22440 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
22450 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   rc);.}.../*.** 
22460 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
22470 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
22480 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
22490 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
224a0 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
224b0 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
224c0 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
224d0 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
224e0 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
224f0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
22500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
22510 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
22520 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
22530 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
22540 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
22550 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
22560 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
22570 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
22580 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
22590 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
225a0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
225b0 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
225c0 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
225d0 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
225e0 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
225f0 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
22600 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
22610 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
22620 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
22630 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
22640 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
22650 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
22660 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
22670 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
22680 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
22690 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
226a0 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
226b0 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
226c0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
226d0 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
226e0 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
226f0 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
22700 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
22710 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
22720 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
22730 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
22740 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
22750 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
22760 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
22770 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
22780 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
22790 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
227a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
227b0 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
227c0 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
227d0 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
227e0 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
227f0 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
22800 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  d PAGER_NO_READL
22810 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  OCK flags..**.**
22820 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
22830 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
22840 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
22850 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
22860 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
22870 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
22880 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
22890 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
228a0 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
228b0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
228c0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
228d0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
228e0 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
228f0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
22900 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
22910 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
22920 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
22930 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
22940 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
22950 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
22960 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
22970 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
22980 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
22990 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
229a0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
229b0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
229c0 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
229d0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
229e0 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
229f0 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
22a00 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
22a10 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
22a20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22a30 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
22a40 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
22a50 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
22a60 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
22a70 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
22a80 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
22a90 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
22aa0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
22ab0 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
22ac0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
22ad0 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
22ae0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22af0 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
22b00 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
22b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
22b20 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
22b30 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
22b40 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
22b50 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
22b60 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
22b70 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
22b80 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
22b90 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
22ba0 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
22bb0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
22bc0 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
22bd0 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
22be0 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f  init)(DbPage*) /
22bf0 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65  * Function to re
22c00 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73  initialize pages
22c10 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
22c20 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
22c30 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
22c40 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
22c50 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
22c60 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
22c70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
22c80 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22c90 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
22ca0 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
22cb0 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
22cc0 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
22cd0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
22ce0 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
22cf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
22d00 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
22d10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
22d20 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
22d30 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
22d40 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
22d50 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
22d60 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
22d70 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
22d80 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
22d90 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
22da0 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
22db0 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
22dc0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
22dd0 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
22de0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
22df0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
22e00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22e10 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
22e20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
22e30 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
22e40 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
22e50 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
22e60 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
22e70 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  rnal */.  int no
22e80 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
22e90 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
22ea0 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54  DLOCK)!=0;  /* T
22eb0 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64  rue to omit read
22ec0 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  -lock */.  int p
22ed0 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
22ee0 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
22ef0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
22f00 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
22f10 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20  PCache */.  u16 
22f20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
22f30 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
22f40 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
22f50 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
22f60 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
22f70 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
22f80 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
22f90 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
22fa0 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
22fb0 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
22fc0 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
22fd0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
22fe0 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69  ub-journal). Thi
22ff0 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61  s.  ** is the ma
23000 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
23010 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ired for an in-m
23020 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
23030 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20  le handle .  ** 
23040 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f  and a regular jo
23050 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
23060 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22  e. Note that a "
23070 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d  regular journal-
23080 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79  handle".  ** may
23090 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61   be a wrapper ca
230a0 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67  pable of caching
230b0 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69   the first porti
230c0 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
230d0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d  l.  ** file in m
230e0 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65  emory to impleme
230f0 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  nt the atomic-wr
23100 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
23110 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72   (see .  ** sour
23120 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e  ce file journal.
23130 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  c)..  */.  if( s
23140 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
23150 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
23160 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
23170 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
23180 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
23190 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
231a0 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c  ze(pVfs));.  }el
231b0 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
231c0 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
231d0 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  (sqlite3MemJourn
231e0 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a  alSize());.  }..
231f0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
23200 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
23210 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
23220 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
23230 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
23240 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
23250 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
23260 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
23270 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
23280 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
23290 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
232a0 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
232b0 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
232c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
232d0 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
232e0 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
232f0 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
23300 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
23310 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
23320 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
23330 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
23340 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
23350 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
23360 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
23370 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
23380 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
23390 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
233a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
233b0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
233c0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
233d0 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  DB.    if( strcm
233e0 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65  p(zFilename,":me
233f0 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  mory:")==0 ){.  
23400 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
23410 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
23420 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ] = 0;.    }else
23430 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
23440 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
23450 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
23460 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
23470 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
23480 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
23490 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
234a0 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
234b0 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
234c0 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
234d0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  hname);.    }.. 
234e0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
234f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
23500 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
23510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23520 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
23530 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
23540 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
23550 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
23560 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
23570 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
23580 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
23590 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
235a0 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
235b0 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
235c0 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
235d0 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
235e0 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
235f0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
23600 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
23610 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
23620 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
23630 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
23640 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
23650 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
23660 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
23670 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
23680 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
23690 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
236a0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
236b0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
236c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
236d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
236e0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
236f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23700 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
23710 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
23720 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
23730 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a  ture, PCache obj
23740 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68  ect, the.  ** th
23750 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ree file descrip
23760 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61  tors, the databa
23770 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  se file name and
23780 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
23790 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68  ** file name. Th
237a0 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f  e layout in memo
237b0 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  ry is as follows
237c0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
237d0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20  Pager object    
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237f0 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62  (sizeof(Pager) b
23800 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50  ytes).  **     P
23810 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20  Cache object    
23820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
23830 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
23840 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e() bytes).  ** 
23850 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
23860 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
23870 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46      (pVfs->szOsF
23880 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ile bytes).  ** 
23890 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20      Sub-journal 
238a0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
238b0 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
238c0 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
238d0 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61       Main journa
238e0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
238f0 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
23900 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
23910 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
23920 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
23930 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
23940 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  +1 bytes).  **  
23950 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
23960 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
23970 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b     (nPathname+8+
23980 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20  1 bytes).  */.  
23990 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c  pPtr = (u8 *)sql
239a0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
239b0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
239c0 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20  f(*pPager)) +   
239d0 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
239e0 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55  cture */.    ROU
239f0 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20  ND8(pcacheSize) 
23a00 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  +           /* P
23a10 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Cache object */.
23a20 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d      ROUND8(pVfs-
23a30 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20  >szOsFile) +    
23a40 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
23a50 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f  b file */.    jo
23a60 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20  urnalFileSize * 
23a70 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2 +          /* 
23a80 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20  The two journal 
23a90 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50  files */ .    nP
23aa0 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20  athname + 1 +   
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ac0 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20  zFilename */.   
23ad0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b   nPathname + 8 +
23ae0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
23af0 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  /* zJournal */. 
23b00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
23b10 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
23b20 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
23b30 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
23b40 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
23b50 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
23b60 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
23b70 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
23b80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23b90 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
23ba0 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
23bb0 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
23bc0 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
23bd0 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
23be0 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
23bf0 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
23c00 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
23c10 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
23c20 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
23c30 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
23c40 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
23c50 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
23c60 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
23c70 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
23c80 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
23c90 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
23ca0 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
23cb0 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
23cc0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
23cd0 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
23ce0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
23cf0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
23d00 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
23d10 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
23d20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
23d30 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
23d40 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
23d50 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
23d60 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
23d70 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
23d80 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23d90 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68  zJournal =   (ch
23da0 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61  ar*)(pPtr += nPa
23db0 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20  thname + 1);.   
23dc0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
23dd0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
23de0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
23df0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
23e00 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
23e10 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
23e20 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
23e30 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
23e40 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
23e50 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20  -journal", 8);. 
23e60 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a     if( pPager->z
23e70 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29  Filename[0]==0 )
23e80 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
23e90 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  l[0] = 0;.    sq
23ea0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
23eb0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  name);.  }.  pPa
23ec0 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
23ed0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
23ee0 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
23ef0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
23f00 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f  pager file..  */
23f10 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
23f20 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
23f30 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20   && !memDb ){.  
23f40 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f60 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
23f70 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
23f80 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
23f90 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
23fa0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
23fb0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
23fc0 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
23fd0 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  ut);.    readOnl
23fe0 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
23ff0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
24000 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
24010 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
24020 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
24030 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
24040 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
24050 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
24060 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
24070 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
24080 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
24090 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
240a0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
240b0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
240c0 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
240d0 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
240e0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
240f0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
24100 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
24110 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
24120 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
24130 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
24140 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
24150 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
24160 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
24170 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24180 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f  ITE_OK && !readO
24190 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74  nly ){.      set
241a0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
241b0 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
241c0 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
241d0 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
241e0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
241f0 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
24200 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70  if( szPageDflt<p
24210 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
24220 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
24230 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
24240 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
24250 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
24260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a   ){.          sz
24270 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
24280 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
24290 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
242a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
242b0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28    szPageDflt = (
242c0 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65 63 74  u16)pPager->sect
242d0 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
242e0 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  }.      }.#ifdef
242f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
24300 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
24310 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
24320 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
24330 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
24340 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
24350 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69  ;.        int ii
24360 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
24370 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
24380 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
24390 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
243a0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
243b0 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
243c0 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
243d0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
243e0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
243f0 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
24400 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
24410 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
24420 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
24430 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
24440 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2){.          if
24450 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
24460 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e  CAP_ATOMIC|(ii>>
24470 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  8)) ){.         
24480 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
24490 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
244a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
244b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
244c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
244d0 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
244e0 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
244f0 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
24500 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
24510 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
24520 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
24530 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
24540 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
24550 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
24560 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
24570 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
24580 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
24590 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
245a0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
245b0 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
245c0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
245d0 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
245e0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
245f0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
24600 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
24610 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
24620 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
24630 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
24640 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
24650 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
24660 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  / .    tempFile 
24670 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
24680 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
24690 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 72 65  XCLUSIVE;.    re
246a0 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61  adOnly = (vfsFla
246b0 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs&SQLITE_OPEN_R
246c0 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20  EADONLY);.  }.. 
246d0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
246e0 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53  g call to PagerS
246f0 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72  etPagesize() ser
24700 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76  ves to set the v
24710 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61  alue of .  ** Pa
24720 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64  ger.pageSize and
24730 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
24740 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
24750 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20   buffer..  */.  
24760 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24770 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
24780 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
24790 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
247a0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
247b0 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73  esize(pPager, &s
247c0 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a  zPageDflt, -1);.
247d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
247e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
247f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
24800 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
24810 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
24820 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65  locks above, fre
24830 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
24840 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
24850 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
24860 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
24870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24880 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
24890 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20  >pTmpSpace );.  
248a0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
248b0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
248c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
248d0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
248e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
248f0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
24900 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a  PCache object. *
24910 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74  /.  assert( nExt
24920 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78  ra<1000 );.  nEx
24930 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
24940 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  tra);.  sqlite3P
24950 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
24960 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
24970 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
24980 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
24990 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
249a0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
249b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
249c0 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
249d0 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
249e0 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
249f0 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
24a00 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
24a10 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
24a20 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
24a30 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
24a40 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
24a50 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
24a60 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
24a70 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
24a80 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63  ock = (noReadloc
24a90 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f  k && readOnly) ?
24aa0 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  1:0;.  /* pPager
24ab0 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
24ac0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
24ad0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
24ae0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
24af0 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
24b00 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
24b10 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  d = (u8)memDb;. 
24b20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
24b30 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
24b40 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
24b50 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
24b60 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
24b70 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
24b80 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
24b90 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
24ba0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
24bb0 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
24bc0 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  CK; */.  assert(
24bd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
24be0 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
24bf0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
24c00 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
24c10 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
24c20 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
24c30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
24c40 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
24c50 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
24c60 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
24c70 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
24c80 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
24c90 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
24ca0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
24cb0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
24cc0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
24cd0 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
24ce0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
24cf0 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
24d00 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
24d10 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
24d20 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
24d30 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
24d40 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
24d50 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
24d60 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
24d70 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
24d80 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
24d90 30 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  0; */.  assert( 
24da0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50  useJournal || pP
24db0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
24dc0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
24dd0 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
24de0 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
24df0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67  >fullSync = pPag
24e00 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b  er->noSync ?0:1;
24e10 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  .  pPager->sync_
24e20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  flags = SQLITE_S
24e30 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a  YNC_NORMAL;.  /*
24e40 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
24e50 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
24e60 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
24e70 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
24e80 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
24e90 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
24ea0 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78  Extra = (u16)nEx
24eb0 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
24ec0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
24ed0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
24ee0 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
24ef0 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69  MIT;.  assert( i
24f00 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
24f10 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b  ) || tempFile );
24f20 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
24f30 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
24f40 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  !useJournal ){. 
24f50 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
24f60 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
24f70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a  OURNALMODE_OFF;.
24f80 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44    }else if( memD
24f90 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
24fa0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
24fb0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
24fc0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
24fd0 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
24fe0 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
24ff0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
25000 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
25010 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
25020 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
25030 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  t;.  /* memset(p
25040 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
25050 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
25060 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a  aHash)); */..  *
25070 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
25080 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
25090 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
250a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
250b0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
250c0 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
250d0 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
250e0 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
250f0 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
25100 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
25110 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
25120 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
25130 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
25140 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
25150 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
25160 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
25170 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
25180 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
25190 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
251a0 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
251b0 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
251c0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
251d0 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
251e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
251f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
25200 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
25210 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
25220 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
25230 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
25240 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
25250 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
25260 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
25270 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
25280 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
25290 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
252a0 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
252b0 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
252c0 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
252d0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
252e0 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
252f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
25300 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
25310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
25320 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
25330 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
25340 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
25350 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
25360 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
25370 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
25380 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
25390 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
253a0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
253b0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
253c0 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
253d0 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
253e0 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
253f0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
25400 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
25410 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25420 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
25430 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
25440 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
25450 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
25460 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
25470 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
25480 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
25490 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
254a0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
254b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
254c0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
254d0 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
254e0 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
254f0 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
25500 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
25510 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
25520 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
25530 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
25540 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
25550 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
25560 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
25570 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
25580 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
25590 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
255a0 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
255b0 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
255c0 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
255d0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
255e0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
255f0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
25600 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
25610 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
25620 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
25630 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
25640 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
25650 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
25660 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
25670 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
25680 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
25690 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
256a0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
256b0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
256c0 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
256d0 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
256e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
256f0 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
25700 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
25710 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
25720 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
25730 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
25740 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
25770 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
25780 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  sts;            
25790 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
257a0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
257b0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a   is present */..
257c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
257d0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
257e0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
257f0 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
25800 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
25810 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
25820 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
25830 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
25840 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25850 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44   <= PAGER_SHARED
25860 20 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20   );..  *pExists 
25870 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
25880 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
25890 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
258a0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
258b0 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
258c0 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
258d0 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
258e0 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  s ){.    int loc
258f0 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ked;            
25900 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
25910 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c  some process hol
25920 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
25930 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61  ck */..    /* Ra
25940 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72  ce condition her
25950 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63  e:  Another proc
25960 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ess might have b
25970 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  een holding the.
25980 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52      ** the RESER
25990 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76  VED lock and hav
259a0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  e a journal open
259b0 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f   at the sqlite3O
259c0 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a  sAccess() .    *
259d0 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75  * call above, bu
259e0 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  t then delete th
259f0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72  e journal and dr
25a00 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f  op the lock befo
25a10 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74  re.    ** we get
25a20 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
25a30 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  g sqlite3OsCheck
25a40 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63  ReservedLock() c
25a50 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20  all.  If that.  
25a60 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65    ** is the case
25a70 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
25a80 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65  ight think there
25a90 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
25aa0 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  l when.    ** in
25ab0 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e   fact there is n
25ac0 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c  one.  This resul
25ad0 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f  ts in a false-po
25ae0 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c  sitive which wil
25af0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  l.    ** be deal
25b00 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c  t with by the pl
25b10 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20  ayback routine. 
25b20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20   Ticket #3883.. 
25b30 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
25b40 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
25b50 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
25b60 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
25b70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25b80 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64  TE_OK && !locked
25b90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
25ba0 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  age;..      /* C
25bb0 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66  heck the size of
25bc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25bd0 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73  le. If it consis
25be0 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20  ts of 0 pages,. 
25bf0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c       ** then del
25c00 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
25c10 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65  file. See the he
25c20 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f  ader comment abo
25c30 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a  ve for .      **
25c40 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68   the reasoning h
25c50 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ere.  Delete the
25c60 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
25c70 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20  l file under.   
25c80 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44     ** a RESERVED
25c90 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72   lock to avoid r
25ca0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  ace conditions a
25cb0 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c  nd to avoid viol
25cc0 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b  ating.      ** [
25cd0 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a  H33020]..      *
25ce0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
25cf0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
25d00 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
25d10 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
25d20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25d30 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
25d40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
25d50 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
25d60 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
25d70 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
25d80 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
25d90 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
25da0 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  CK)==SQLITE_OK )
25db0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
25dc0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
25dd0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
25de0 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
25df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
25e00 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
25e10 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
25e20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
25e40 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
25e50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25e60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25e70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
25e80 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  sts and no other
25e90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
25ea0 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20  a reserved.     
25eb0 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74       ** or great
25ec0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
25ed0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f  atabase file. No
25ee0 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
25ef0 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
25f00 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
25f10 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61  non-zero bytes a
25f20 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
25f30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
25f40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
25f50 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20   there is, then 
25f60 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73  we consider this
25f70 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68   journal to be h
25f80 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20  ot. If not, .   
25f90 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
25fa0 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20   be ignored..   
25fb0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25fc0 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
25fd0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
25fe0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
25ff0 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
26000 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26010 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
26020 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
26030 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
26040 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  &f);.          i
26050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26070 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  u8 first = 0;.  
26080 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
26090 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
260a0 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20  ger->jfd, (void 
260b0 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b  *)&first, 1, 0);
260c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
260d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
260e0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
260f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
26100 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26110 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26120 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
26130 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
26140 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
26150 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72   *pExists = (fir
26160 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  st!=0);.        
26170 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
26180 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
26190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
261a0 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  * If we cannot o
261b0 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  pen the rollback
261c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
261d0 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66   order to see if
261e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
261f0 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68  its has a zero h
26200 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68  eader, that migh
26210 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49  t be due to an I
26220 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20  /O error, or.   
26230 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d           ** it m
26240 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74  ight be due to t
26250 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  he race conditio
26260 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  n described abov
26270 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20  e and in.       
26280 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23       ** ticket #
26290 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61  3883.  Either wa
262a0 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  y, assume that t
262b0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
262c0 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
262d0 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20  * This might be 
262e0 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
262f0 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c  .  But if it is,
26300 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
26310 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74        ** automat
26320 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62  ic journal playb
26330 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79  ack and recovery
26340 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20   mechanism will 
26350 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20  deal.           
26360 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65   ** with it unde
26370 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
26380 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20  ock where we do 
26390 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  not need to.    
263a0 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79          ** worry
263b0 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61   so much with ra
263c0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20  ce conditions.. 
263d0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
263e0 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
263f0 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ts = 1;.        
26400 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26410 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
26420 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26430 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
26440 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26450 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26460 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
26470 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
26480 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
26490 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
264a0 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
264b0 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  l sqlite3PagerAc
264c0 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66  quire() until af
264d0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
264e0 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
264f0 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
26500 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
26510 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
26520 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
26530 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26540 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
26550 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
26560 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
26570 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
26580 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
26590 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
265a0 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
265b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
265c0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
265d0 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
265e0 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
265f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
26600 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
26610 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
26620 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
26630 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
26640 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
26650 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
26660 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
26670 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
26680 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
26690 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
266a0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
266b0 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
266c0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
266d0 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
266e0 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
266f0 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
26700 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
26710 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
26720 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
26730 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
26740 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
26750 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
26760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26770 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
26780 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
26790 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
267a0 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
267b0 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
267c0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
267d0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
267e0 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
267f0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
26800 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
26810 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
26820 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
26830 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
26840 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
26850 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
26860 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
26870 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
26880 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
26890 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
268a0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
268b0 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
268c0 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
268d0 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
268e0 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
268f0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64   the operation d
26900 65 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20  escribed by (2) 
26910 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74  above is not att
26920 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74  empted, and if t
26930 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69  he.** pager is i
26940 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
26950 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
26960 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69  TE_FULL when thi
26970 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  s is called,.** 
26980 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
26990 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
269a0 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65  turned. It is pe
269b0 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20  rmitted to read 
269c0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
269d0 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46  when in SQLITE_F
269e0 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e  ULL error state.
269f0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
26a00 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  , if everything 
26a10 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
26a20 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
26a30 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49  rned. If an.** I
26a40 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
26a50 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
26a60 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
26a70 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
26a80 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72  urnal.** file or
26a90 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
26aa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
26ab0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
26ac0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
26ad0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
26ae0 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
26af0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26b00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
26b30 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52  /.  int isErrorR
26b40 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  eset = 0;       
26b50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
26b60 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f  f recovering fro
26b70 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f  m error state */
26b80 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
26b90 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
26ba0 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
26bb0 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
26bc0 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
26bd0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
26be0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
26bf0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
26c00 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
26c10 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  che)==0 );.  if(
26c20 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20   NEVER(MEMDB && 
26c30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
26c40 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65   ){ return pPage
26c50 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20  r->errCode; }.. 
26c60 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
26c70 62 61 73 65 20 69 73 20 69 6e 20 61 6e 20 65 72  base is in an er
26c80 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69  ror-state, now i
26c90 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  s a chance to cl
26ca0 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
26cb0 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
26cc0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
26cd0 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
26ce0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e  rollback.  ** an
26cf0 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e  y hot journal in
26d00 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
26d10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
26d20 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
26d30 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
26d40 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
26d50 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
26d60 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72  ){.      isError
26d70 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d  Reset = 1;.    }
26d80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
26d90 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
26da0 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
26db0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
26dc0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
26dd0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
26de0 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
26df0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
26e00 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
26e10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
26e20 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
26e30 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74   || isErrorReset
26e40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
26e50 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
26e60 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
26e70 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f  .    int isHotJo
26e80 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61  urnal = 0;.    a
26e90 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
26ea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
26eb0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
26ec0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
26ed0 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  he)==0 );.    if
26ee0 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64  ( pPager->noRead
26ef0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73  lock ){.      as
26f00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65  sert( pPager->re
26f10 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20  adOnly );.      
26f20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
26f30 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
26f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
26f50 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
26f60 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
26f70 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
26f80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26f90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26fa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26fb0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
26fc0 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  OCK );.        r
26fd0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
26fe0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
26ff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
27000 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27010 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
27020 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  OCK );..    /* I
27030 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
27040 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
27050 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
27060 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
27070 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
27080 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
27090 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
270a0 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
270b0 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
270c0 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65    if( !isErrorRe
270d0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  set ){.      ass
270e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
270f0 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52  te <= PAGER_SHAR
27100 45 44 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ED );.      rc =
27110 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
27120 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75  Pager, &isHotJou
27130 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
27140 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27150 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
27160 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
27170 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45     }.    if( isE
27180 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48  rrorReset || isH
27190 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
271a0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
271b0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
271c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
271d0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
271e0 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
271f0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
27200 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
27210 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
27220 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
27230 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
27240 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
27250 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
27260 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
27270 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
27280 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
27290 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
272a0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
272b0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
272c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
272d0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
272e0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
272f0 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
27300 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
27310 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
27320 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
27330 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
27340 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
27350 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
27360 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
27370 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
27380 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
27390 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
273a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
273b0 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
273c0 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
273d0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
273e0 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
273f0 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
27400 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
27410 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
27420 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
27430 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
27440 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56  ->state<EXCLUSIV
27450 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
27460 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27470 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
27480 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
27490 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
274a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
274b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
274c0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
274d0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
274e0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
274f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27500 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
27510 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
27520 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
27530 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
27540 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
27550 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73  ite access. This
27560 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
27570 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
27580 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
27590 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
275a0 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
275b0 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a  open and.      *
275c0 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  * possibly used 
275d0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
275e0 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73  n later on. On s
275f0 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ome systems, the
27600 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e  .      ** OsTrun
27610 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
27620 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
27630 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
27640 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
27650 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
27660 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
27670 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
27680 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27690 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  d) ){.        in
276a0 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72  t res;.        r
276b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
276c0 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d  ess(pVfs,pPager-
276d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45  >zJournal,SQLITE
276e0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26  _ACCESS_EXISTS,&
276f0 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
27700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
27720 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20   res ){.        
27730 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
27740 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
27750 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
27760 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
27770 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
27780 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
27790 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
277a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
277b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
277c0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
277d0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
277e0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
277f0 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
27800 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27810 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27820 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
27830 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
27840 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
27850 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
27860 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
27870 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
27880 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27890 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
278a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
278b0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
278c0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
278d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
278e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
278f0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
27900 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
27910 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61  t exist, it usua
27920 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73  lly means that s
27930 6f 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ome .           
27940 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
27950 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20  tion managed to 
27960 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20  get in and roll 
27970 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a  it back before .
27980 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
27990 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
279a0 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
279b0 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
279c0 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
279d0 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61        ** may mea
279e0 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  n that the pager
279f0 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f   was in the erro
27a00 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
27a10 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
27a20 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
27a30 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75  lled and the jou
27a40 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
27a50 6f 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20  ot exist.  */.  
27a60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
27a70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
27a80 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
27a90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27ab0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27ac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27ad0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
27ae0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
27af0 20 52 65 73 65 74 20 74 68 65 20 6a 6f 75 72 6e   Reset the journ
27b00 61 6c 20 73 74 61 74 75 73 20 66 69 65 6c 64 73  al status fields
27b10 20 74 6f 20 69 6e 64 69 63 61 74 65 73 20 74 68   to indicates th
27b20 61 74 20 77 65 20 68 61 76 65 20 6e 6f 0a 20 20  at we have no.  
27b30 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
27b40 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 69 73 20  journal at this 
27b50 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  time. */.      p
27b60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
27b70 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
27b80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27b90 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
27ba0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
27bb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
27bc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
27bd0 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d   0;. .      /* M
27be0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75  ake sure the jou
27bf0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
27c00 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  en synced to dis
27c10 6b 2e 20 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a  k. */. .      /*
27c20 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
27c30 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
27c40 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
27c50 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
27c60 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
27c70 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
27c80 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
27c90 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
27ca0 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
27cb0 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
27cc0 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
27cd0 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
27ce0 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
27cf0 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
27d00 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
27d10 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
27d20 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
27d30 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
27d40 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
27d50 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
27d60 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
27d70 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
27d80 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
27d90 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
27da0 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
27db0 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
27dc0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
27dd0 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
27de0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
27df0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
27e00 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
27e10 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63    rc = pagerSync
27e20 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
27e30 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
27e40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27e50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27e60 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
27e70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
27e80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
27e90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27ea0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
27eb0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
27ec0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
27ed0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
27ee0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27ef0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
27f00 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d   (pPager->state=
27f10 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  =PAGER_SHARED). 
27f20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
27f30 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
27f40 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
27f50 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
27f60 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  D).      );.    
27f70 7d 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  }..    if( pPage
27f80 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71  r->pBackup || sq
27f90 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
27fa0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
27fb0 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20  ache)>0 ){.     
27fc0 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
27fd0 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
27fe0 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
27ff0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
28000 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
28010 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
28020 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
28030 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
28040 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  us.      ** read
28050 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
28060 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74  ction).  Check t
28070 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  o see if the dat
28080 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  abase.      ** h
28090 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
280a0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
280b0 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
280c0 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
280d0 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
280e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
280f0 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
28100 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
28110 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
28120 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
28130 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
28140 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
28150 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
28160 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
28170 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
28180 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
28190 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
281a0 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
281b0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
281c0 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
281d0 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
281e0 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
281f0 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
28200 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
28210 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
28220 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
28230 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
28240 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
28250 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
28260 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
28270 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
28280 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
28290 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
282a0 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
282b0 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
282c0 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
282d0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   */.      int nP
282e0 61 67 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20  age;.      char 
282f0 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
28300 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
28310 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71  Vers)];.      sq
28320 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
28330 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
28340 67 65 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ge);..      if( 
28350 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
28360 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28370 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
28380 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
28390 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
283a0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30       if( nPage>0
283b0 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
283c0 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
283d0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
283e0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
283f0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
28400 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
28410 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
28420 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
28430 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
28440 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28450 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28460 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
28470 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
28480 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28490 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
284a0 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
284b0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
284c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
284d0 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
284e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
284f0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
28500 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
28510 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
28520 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
28530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28540 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28550 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
28560 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
28570 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
28580 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
28590 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
285a0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
285b0 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
285c0 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
285d0 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
285e0 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
285f0 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
28600 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
28610 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
28620 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
28630 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  esent(pPager);. 
28640 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
28650 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28660 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72   ){.    /* pager
28670 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  _unlock() is a n
28680 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69  o-op for exclusi
28690 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d  ve mode and in-m
286a0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
286b0 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   */.    pager_un
286c0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
286d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
286e0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
286f0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
28700 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
28710 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
28720 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
28730 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
28740 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
28750 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
28760 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
28770 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
28780 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
28790 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
287a0 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
287b0 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
287c0 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
287d0 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
287e0 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
287f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
28800 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
28810 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
28820 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
28830 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73  Pager){.  if( (s
28840 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
28850 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
28860 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20  ache)==0).   && 
28870 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  (!pPager->exclus
28880 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
28890 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29  r->journalOff>0)
288a0 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72   .  ){.    pager
288b0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
288c0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
288d0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
288e0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
288f0 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  age number pgno 
28900 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20  in pager pPager 
28910 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72  (a page.** refer
28920 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62  ence has type Db
28930 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72  Page*). If the r
28940 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
28950 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
28960 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
28970 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
28980 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
28990 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
289a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
289b0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
289c0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
289d0 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
289e0 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
289f0 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
28a00 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
28a10 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
28a20 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
28a30 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
28a40 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
28a50 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
28a60 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
28a70 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
28a80 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
28a90 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
28aa0 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
28ab0 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
28ac0 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
28ad0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
28ae0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
28af0 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
28b00 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
28b10 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
28b20 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
28b30 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
28b40 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
28b50 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
28b60 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
28b70 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
28b80 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
28b90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
28ba0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
28bb0 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
28bc0 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
28bd0 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
28be0 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
28bf0 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
28c00 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
28c10 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
28c20 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
28c30 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
28c40 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
28c50 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
28c60 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
28c70 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
28c80 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
28c90 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
28ca0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
28cb0 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
28cc0 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
28cd0 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
28ce0 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
28cf0 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
28d00 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
28d10 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
28d20 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
28d30 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
28d40 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
28d50 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
28d60 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
28d70 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
28d80 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
28d90 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65  two seperate sce
28da0 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
28db0 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
28dc0 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
28dd0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
28de0 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
28df0 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
28e00 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
28e10 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
28e20 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
28e30 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
28e40 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
28e50 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  che to be filled
28e60 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72   with the data r
28e70 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
28e80 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a   the savepoint j
28e90 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
28ea0 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
28eb0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
28ec0 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65  a returned is ze
28ed0 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  roed instead of.
28ee0 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72  ** being read fr
28ef0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
28f00 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
28f10 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f  he bits correspo
28f20 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f  nding.** to pgno
28f30 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
28f40 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20  rnal (bitvec of 
28f50 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72  pages already wr
28f60 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
28f70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
28f80 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
28f90 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
28fa0 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79  t bitvecs of any
28fb0 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69   open.** savepoi
28fc0 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  nts are set. Thi
28fd0 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70  s means if the p
28fe0 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  age is made writ
28ff0 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70  able at any.** p
29000 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
29010 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  re, using a call
29020 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
29030 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e  Write(), its con
29040 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  tents.** will no
29050 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  t be journaled. 
29060 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a  This saves IO..*
29070 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
29080 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
29090 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
290a0 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
290b0 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
290c0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
290d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
290e0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
290f0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
29100 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
29110 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
29120 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
29130 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
29140 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
29150 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
29160 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
29170 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
29180 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
29190 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
291a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
291b0 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
291c0 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
291d0 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
291e0 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
291f0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
29200 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
29210 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
29220 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
29230 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
29240 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
29250 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
29260 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
29270 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
29280 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
29290 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
292a0 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
292b0 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
292c0 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
292d0 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
292e0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
292f0 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
29300 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
29310 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29320 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
29330 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
29340 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
29350 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
29360 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
29370 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
29380 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
29390 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
293a0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
293b0 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20   bother reading 
293c0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
293d0 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  k if true */.){.
293e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
293f0 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
29400 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
29410 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
29420 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29430 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 55  r->state>PAGER_U
29440 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  NLOCK );..  if( 
29450 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
29460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
29470 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
29480 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
29490 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
294a0 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20  r state, return 
294b0 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61  an error immedia
294c0 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  tely. .  ** Othe
294d0 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74  rwise, request t
294e0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
294f0 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a   PCache layer. *
29500 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
29510 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
29520 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  OK && pPager->er
29530 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
29540 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  LL ){.    rc = p
29550 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
29560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
29570 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
29580 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
29590 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70  ache, pgno, 1, p
295a0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  pPage);.  }..  i
295b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
295c0 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
295d0 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  r the call to sq
295e0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
295f0 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  () returned an e
29600 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20  rror or the.    
29610 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72  ** pager was alr
29620 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
29630 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
29640 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
29650 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65  alled..    ** Se
29660 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a  t pPg to 0 and j
29670 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70  ump to the excep
29680 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a  tion handler.  *
29690 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  /.    pPg = 0;. 
296a0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
296b0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20  quire_err;.  }. 
296c0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
296d0 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
296e0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
296f0 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70  Page)->pPager==p
29700 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67  Pager || (*ppPag
29710 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b  e)->pPager==0 );
29720 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65  ..  if( (*ppPage
29730 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f  )->pPager && !no
29740 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f  Content ){.    /
29750 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
29760 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64  he pcache alread
29770 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  y contains an in
29780 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f  itialized copy o
29790 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  f.    ** the pag
297a0 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  e. Return withou
297b0 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20  t further ado.  
297c0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
297d0 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50  gno<=PAGER_MAX_P
297e0 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47  GNO && pgno!=PAG
297f0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
29800 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  r) );.    PAGER_
29810 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
29820 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
29830 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
29840 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
29850 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
29860 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
29870 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
29880 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
29890 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
298a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78   */.    int nMax
298b0 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  ;..    PAGER_INC
298c0 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29  R(pPager->nMiss)
298d0 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50  ;.    pPg = *ppP
298e0 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  age;.    pPg->pP
298f0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a  ager = pPager;..
29900 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
29910 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
29920 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
29930 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
29940 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e   a page.    ** n
29950 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
29960 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20  an this, or the 
29970 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70  unused locking-p
29980 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65  age, is requeste
29990 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  d. */.    if( pg
299a0 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
299b0 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  O || pgno==PAGER
299c0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
299d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
299e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
299f0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
29a00 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
29a10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
29a20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
29a30 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
29a40 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20  &nMax);.    if( 
29a50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29a60 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
29a70 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
29a80 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45     }..    if( ME
29a90 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74  MDB || nMax<(int
29aa0 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  )pgno || noConte
29ab0 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  nt || !isOpen(pP
29ac0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
29ad0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
29ae0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
29af0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29b00 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  E_FULL;.        
29b10 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
29b20 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
29b30 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74        if( noCont
29b40 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ent ){.        /
29b50 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74  * Failure to set
29b60 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
29b70 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76   InJournal bit-v
29b80 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e  ectors is benign
29b90 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  ..        ** It 
29ba0 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61  merely means tha
29bb0 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f  t we might do so
29bc0 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f  me extra work to
29bd0 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20   journal a .    
29be0 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74      ** page that
29bf0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
29c00 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  o be journaled. 
29c10 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62   Nevertheless, b
29c20 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20  e sure .        
29c30 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63  ** to test the c
29c40 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c  ase where a mall
29c50 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
29c60 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
29c70 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  set .        ** 
29c80 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76  a bit in a bit v
29c90 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  ector..        *
29ca0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
29cb0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
29cc0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oc();.        if
29cd0 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
29ce0 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
29cf0 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
29d00 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33  ( rc = ) sqlite3
29d10 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
29d20 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
29d30 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  no);.          t
29d40 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
29d50 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
29d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
29d70 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
29d80 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
29d90 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67  tvecs(pPager, pg
29da0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
29db0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
29dc0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
29dd0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
29de0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
29df0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
29e00 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
29e10 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
29e20 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  e);.      IOTRAC
29e30 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
29e40 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
29e50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
29e60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
29e70 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
29e80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  );.      rc = re
29e90 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
29ea0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29eb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29ec0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
29ed0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
29ee0 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  }.    }.#ifdef S
29ef0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
29f00 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
29f10 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
29f20 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
29f30 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  f.  }..  return 
29f40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
29f50 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20  r_acquire_err:. 
29f60 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
29f70 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
29f80 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pPg ){.    sqlit
29f90 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
29fa0 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
29fb0 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
29fc0 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65  ger);..  *ppPage
29fd0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
29fe0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
29ff0 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
2a000 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
2a010 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
2a020 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
2a030 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
2a040 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
2a050 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2a060 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
2a070 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
2a080 74 20 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f  t in cache. Also
2a090 2c 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68  , return 0 if th
2a0a0 65 20 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69  e .** pager is i
2a0b0 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  n PAGER_UNLOCK s
2a0c0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
2a0d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2a0e0 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20  d,.** or if the 
2a0f0 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65  pager is in an e
2a100 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72  rror state other
2a110 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c   than SQLITE_FUL
2a120 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
2a130 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
2a140 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
2a150 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
2a160 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
2a170 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2a180 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
2a190 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
2a1a0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
2a1b0 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
2a1c0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2a1d0 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
2a1e0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2a1f0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
2a200 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2a210 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
2a220 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
2a230 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
2a240 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
2a250 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
2a260 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
2a270 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
2a280 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
2a290 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2a2a0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
2a2b0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
2a2c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2a2d0 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29  er->pPCache!=0 )
2a2e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2a2f0 65 72 2d 3e 73 74 61 74 65 20 3e 20 50 41 47 45  er->state > PAGE
2a300 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71  R_UNLOCK );.  sq
2a310 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
2a320 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2a330 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29  , pgno, 0, &pPg)
2a340 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ;.  return pPg;.
2a350 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
2a360 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
2a370 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2a380 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
2a390 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
2a3a0 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
2a3b0 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
2a3c0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
2a3d0 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
2a3e0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
2a3f0 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
2a400 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
2a410 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
2a420 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
2a430 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
2a440 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f  * removed..*/.vo
2a450 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
2a460 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
2a470 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  ){.  if( pPg ){.
2a480 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
2a490 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2a4a0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
2a4b0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
2a4c0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49      pagerUnlockI
2a4d0 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
2a4e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2a4f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2a500 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
2a510 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
2a520 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
2a530 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
2a540 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
2a550 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
2a560 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2a570 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
2a580 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2a590 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
2a5a0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
2a5b0 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
2a5c0 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
2a5d0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
2a5e0 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
2a5f0 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
2a600 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
2a610 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
2a620 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
2a630 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
2a640 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
2a650 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
2a660 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
2a670 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
2a680 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
2a690 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
2a6a0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
2a6b0 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
2a6c0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
2a6d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
2a6e0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
2a6f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
2a700 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
2a710 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
2a720 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
2a730 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
2a740 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2a750 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
2a760 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
2a770 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2a780 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
2a790 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
2a7a0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
2a7b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2a7c0 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
2a7d0 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
2a7e0 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
2a7f0 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
2a800 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
2a810 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
2a820 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
2a830 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
2a840 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
2a850 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
2a860 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
2a870 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
2a880 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
2a890 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
2a8a0 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
2a8b0 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
2a8c0 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
2a8d0 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
2a8e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a8f0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
2a900 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
2a910 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2a920 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a940 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2a950 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
2a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a980 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61  * Size of databa
2a990 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c  se file */.  sql
2a9a0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
2a9b0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
2a9c0 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
2a9d0 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
2a9e0 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
2a9f0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2aa00 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
2aa10 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
2aa20 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2aa30 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
2aa40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2aa50 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2aa60 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61  LMODE_OFF );.  a
2aa70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
2aa80 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
2aa90 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61    .  /* If alrea
2aaa0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
2aab0 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
2aac0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2aad0 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68    But on.  ** th
2aae0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
2aaf0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
2ab00 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65  ver called if we
2ab10 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
2ab20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74    ** an error st
2ab30 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ate. */.  if( NE
2ab40 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
2ab50 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
2ab60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
2ab70 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2ab80 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
2ab90 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
2aba0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
2abb0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
2abc0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
2abd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
2abe0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
2abf0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
2ac00 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 69  eate(nPage);.  i
2ac10 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
2ac20 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
2ac30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ac40 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  MEM;.  }..  /* O
2ac50 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2ac60 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
2ac70 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
2ac80 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
2ac90 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
2aca0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2acb0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2acc0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2acd0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
2ace0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
2acf0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
2ad00 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
2ad10 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
2ad20 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
2ad30 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
2ad40 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
2ad50 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
2ad60 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
2ad70 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
2ad80 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
2ad90 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
2ada0 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
2adb0 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
2adc0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
2add0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
2ade0 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20  MP_JOURNAL):.   
2adf0 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
2ae00 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2ae10 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69 66  ).        );.#if
2ae20 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2ae30 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2ae40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ae50 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
2ae60 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
2ae70 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2ae80 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
2ae90 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
2aea0 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20  ze(pPager).     
2aeb0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
2aec0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2aed0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2aee0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
2aef0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30  r->jfd, flags, 0
2af00 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
2af10 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
2af20 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
2af30 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2af40 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57   );.  }...  /* W
2af50 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
2af60 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
2af70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2af80 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a  e and open .  **
2af90 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2afa0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
2afb0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2afc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
2afd0 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
2afe0 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
2aff0 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
2b000 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  d. */.    pPager
2b010 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
2b020 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2b030 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2b040 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
2b050 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
2b060 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
2b070 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
2b080 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2b090 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70  alOff = 0;.    p
2b0a0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
2b0b0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2b0c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
2b0d0 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  ;.    rc = write
2b0e0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
2b0f0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  r);.  }..  if( r
2b100 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b110 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
2b120 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
2b130 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
2b140 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
2b150 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rnal = 0;.  }.  
2b160 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b170 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74  .** Begin a writ
2b180 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  e-transaction on
2b190 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
2b1a0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
2b1b0 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e  a .** write-tran
2b1c0 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
2b1d0 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  ady been opened,
2b1e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2b1f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2b200 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61   If the exFlag a
2b210 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
2b220 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
2b230 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
2b240 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  ED.** lock on th
2b250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2b260 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
2b270 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ue, then acquire
2b280 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20   at least.** an 
2b290 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
2b2a0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
2b2b0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
2b2c0 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66  no locking .** f
2b2d0 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65  unctions need be
2b2e0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
2b2f0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
2b300 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
2b310 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c  memory file and,
2b320 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b330 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  e is .** opened 
2b340 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65  if it has not be
2b350 65 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f 72 20  en already. For 
2b360 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2b370 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a  , the opening .*
2b380 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * of the journal
2b390 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
2b3a0 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
2b3b0 20 61 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20   an actual need 
2b3c0 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20  to .** write to 
2b3d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44  the journal. TOD
2b3e0 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65 20 74 65  O: Why handle te
2b3f0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 64 69  mporary files di
2b400 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a  fferently?.**.**
2b410 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2b420 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 28  file is opened (
2b430 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  or if it is alre
2b440 61 64 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20  ady open), then 
2b450 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  a.** journal-hea
2b460 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 74  der is written t
2b470 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
2b480 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
2b490 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
2b4a0 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ument is non-zer
2b4b0 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d  o, then any sub-
2b4c0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a  journal opened.*
2b4d0 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  * within this tr
2b4e0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
2b4f0 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69  e opened as an i
2b500 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54  n-memory file. T
2b510 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66  his.** has no ef
2b520 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d  fect if the sub-
2b530 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61  journal is alrea
2b540 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74  dy opened (as it
2b550 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20   may be when.** 
2b560 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2b570 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66  sive mode) or if
2b580 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2b590 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
2b5a0 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  e a.** sub-journ
2b5b0 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49  al. If the subjI
2b5c0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
2b5d0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61   is zero, then a
2b5e0 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73  ny required.** s
2b5f0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d  ub-journal is im
2b600 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d  plemented in-mem
2b610 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73  ory if pPager is
2b620 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2b630 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75  tabase, .** or u
2b640 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79  sing a temporary
2b650 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e   file otherwise.
2b660 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2b670 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20  agerBegin(Pager 
2b680 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46  *pPager, int exF
2b690 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d  lag, int subjInM
2b6a0 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63  emory){.  int rc
2b6b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b6c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2b6d0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
2b6e0 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  OCK );.  pPager-
2b6f0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20  >subjInMemory = 
2b700 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  (u8)subjInMemory
2b710 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
2b720 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
2b730 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
2b740 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
2b750 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
2b760 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2b770 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
2b780 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 69 66 28  File );..    if(
2b790 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2b7a0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ger) ){.      /*
2b7b0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
2b7c0 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
2b7d0 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  se locking_mode=
2b7e0 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61  exclusive, and a
2b7f0 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75  n.      ** exclu
2b800 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
2b810 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
2b820 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
2b830 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20  btain it now..  
2b840 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2b850 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2b860 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65  veMode && sqlite
2b870 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
2b880 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
2b890 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  -1) ){.        r
2b8a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
2b8b0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
2b8c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
2b8d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
2b8e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
2b8f0 52 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  RED;.        if(
2b900 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b910 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2b920 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2b930 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b940 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
2b950 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
2b960 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2b970 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
2b980 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
2b990 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
2b9a0 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
2b9b0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
2b9c0 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
2b9d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
2b9e0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
2b9f0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
2ba00 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
2ba10 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
2ba20 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
2ba30 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2ba40 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
2ba50 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
2ba60 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
2ba70 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
2ba80 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
2ba90 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
2baa0 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65    ** WAL mode se
2bab0 74 73 20 50 61 67 65 72 2e 73 74 61 74 65 20 74  ts Pager.state t
2bac0 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
2bad0 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20   when it has an 
2bae0 6f 70 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72  open.      ** tr
2baf0 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e  ansaction, but n
2bb00 65 76 65 72 20 74 6f 20 50 41 47 45 52 5f 45 58  ever to PAGER_EX
2bb10 43 4c 55 53 49 56 45 2e 20 54 68 69 73 20 69 73  CLUSIVE. This is
2bb20 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20   because in .   
2bb30 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 58 43 4c     ** PAGER_EXCL
2bb40 55 53 49 56 45 20 73 74 61 74 65 20 74 68 65 20  USIVE state the 
2bb50 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63  code to roll bac
2bb60 6b 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e  k savepoint tran
2bb70 73 61 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 2a  sactions.      *
2bb80 2a 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20  * may copy data 
2bb90 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
2bba0 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61  rnal into the da
2bbb0 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 20 77  tabase file as w
2bbc0 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ell.      ** as 
2bbd0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  into the page ca
2bbe0 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64  che. Which would
2bbf0 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e   be incorrect in
2bc00 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20   WAL mode..     
2bc10 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
2bc20 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
2bc30 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
2bc40 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
2bc50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bc60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2bc70 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
2bc80 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
2bc90 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50  Size;.        pP
2bca0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2bcb0 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
2bcc0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2bcd0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
2bce0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
2bcf0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2bd00 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  OK || pPager->st
2bd10 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
2bd20 56 45 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  VED );.      ass
2bd30 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2bd40 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  OK || pPager->st
2bd50 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
2bd60 44 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  D );.    }else{.
2bd70 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
2bd80 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2bd90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2bda0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
2bdb0 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
2bdc0 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
2bdd0 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
2bde0 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
2bdf0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
2be00 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ck. The.      **
2be10 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
2be20 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
2be30 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
2be40 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
2be50 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  VE.      ** lock
2be60 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
2be70 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
2be80 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
2be90 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2bea0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
2beb0 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
2bec0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2bed0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bee0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
2bef0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2bf00 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
2bf10 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20       if( exFlag 
2bf20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2bf30 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
2bf40 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
2bf50 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2bf60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2bf70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f      }..    /* No
2bf80 20 6e 65 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   need to open th
2bf90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
2bfa0 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 49 74  t this time.  It
2bfb0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20   will be.    ** 
2bfc0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 69 74  opened before it
2bfd0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   is written to. 
2bfe0 20 49 66 20 77 65 20 64 65 66 65 72 20 6f 70 65   If we defer ope
2bff0 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ning the journal
2c000 2c 0a 20 20 20 20 2a 2a 20 77 65 20 6d 69 67 68  ,.    ** we migh
2c010 74 20 73 61 76 65 20 74 68 65 20 77 6f 72 6b 20  t save the work 
2c020 6f 66 20 63 72 65 61 74 69 6e 67 20 61 20 66 69  of creating a fi
2c030 6c 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  le if the transa
2c040 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e 64  ction.    ** end
2c050 73 20 75 70 20 62 65 69 6e 67 20 61 20 6e 6f 2d  s up being a no-
2c060 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 7d 65 6c  op..    */.  }el
2c070 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  se if( isOpen(pP
2c080 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
2c090 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2c0a0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
2c0b0 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
2c0c0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
2c0d0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
2c0e0 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a  s mode the last.
2c0f0 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72      ** time a (r
2c100 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72  ead or write) tr
2c110 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75  ansaction was su
2c120 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c  ccessfully concl
2c130 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  uded.    ** by t
2c140 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  his connection. 
2c150 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74  Instead of delet
2c160 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
2c170 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20  file it was .   
2c180 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   ** kept open an
2c190 64 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75  d either was tru
2c1a0 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65  ncated to 0 byte
2c1b0 73 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20  s or its header 
2c1c0 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77  was.    ** overw
2c1d0 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f  ritten with zero
2c1e0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
2c1f0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
2c200 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
2c210 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2c220 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20  er->nRec==0 );. 
2c230 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c240 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30  r->dbOrigSize==0
2c250 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2c260 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2c270 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  al==0 );.    rc 
2c280 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
2c290 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
2c2a0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
2c2b0 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
2c2c0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2c2d0 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 72 63  ger)));.  if( rc
2c2e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c2f0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2c300 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2c310 3b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  ;.    /* Ignore 
2c320 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 74 68 61  any IO error tha
2c330 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
2c340 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
2c350 63 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20  ction(). The.   
2c360 20 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74   ** purpose of t
2c370 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 72  his call is to r
2c380 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
2c390 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
2c3a0 61 67 65 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d  ager.    ** sub-
2c3b0 73 79 73 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e  system. It doesn
2c3c0 27 74 20 6d 61 74 74 65 72 20 69 66 20 74 68 65  't matter if the
2c3d0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
2c3e0 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20 20   not properly.  
2c3f0 20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61    ** finalized a
2c400 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28 73 69  t this point (si
2c410 6e 63 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20  nce it is not a 
2c420 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
2c430 6c 65 20 61 6e 79 77 61 79 29 2e 0a 20 20 20 20  le anyway)..    
2c440 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 65 6e 64  */.    pager_end
2c450 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2c460 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  ger, 0);.  }.  r
2c470 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2c480 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
2c490 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
2c4a0 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
2c4b0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
2c4c0 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
2c4d0 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
2c4e0 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
2c4f0 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
2c500 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
2c510 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
2c520 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
2c530 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
2c540 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
2c550 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
2c560 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
2c570 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
2c580 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
2c590 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
2c5a0 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
2c5b0 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
2c5c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2c5d0 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
2c5e0 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
2c5f0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2c600 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2c610 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2c620 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c630 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  _OK;..  /* This 
2c640 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63  routine is not c
2c650 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 74  alled unless a t
2c660 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
2c670 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a  lready been.  **
2c680 20 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20   started..  */. 
2c690 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c6a0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
2c6b0 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  SERVED );..  /* 
2c6c0 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
2c6d0 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
2c6e0 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74  detected, report
2c6f0 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a   the same error.
2c700 20 20 2a 2a 20 61 67 61 69 6e 2e 0a 20 20 2a 2f    ** again..  */
2c710 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2c720 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
2c730 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2c740 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48  errCode;..  /* H
2c750 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74  igher-level rout
2c760 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20  ines never call 
2c770 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
2c780 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
2c790 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20  .  ** writable. 
2c7a0 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61   But check anywa
2c7b0 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75  y, just for robu
2c7c0 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
2c7d0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72   NEVER(pPager->r
2c7e0 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  eadOnly) ) retur
2c7f0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a  n SQLITE_PERM;..
2c800 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2c810 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
2c820 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
2c830 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74  g);..  /* Mark t
2c840 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
2c850 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
2c860 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2c870 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
2c880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
2c890 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
2c8a0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
2c8b0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
2c8c0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
2c8d0 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e   if( pageInJourn
2c8e0 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a  al(pPg) && !subj
2c8f0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2c900 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
2c910 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
2c920 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61  ager) );.    pPa
2c930 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
2c940 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
2c950 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
2c960 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
2c970 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
2c980 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
2c990 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
2c9a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
2c9b0 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
2c9c0 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
2c9d0 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
2c9e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48  .    **.    ** H
2c9f0 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74  igher level rout
2ca00 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65  ines should have
2ca10 20 61 6c 72 65 61 64 79 20 73 74 61 72 74 65 64   already started
2ca20 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
2ca30 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 65 61      ** which mea
2ca40 6e 73 20 74 68 65 79 20 68 61 76 65 20 61 63 71  ns they have acq
2ca50 75 69 72 65 64 20 74 68 65 20 6e 65 63 65 73 73  uired the necess
2ca60 61 72 79 20 6c 6f 63 6b 73 20 62 75 74 20 74 68  ary locks but th
2ca70 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  e rollback.    *
2ca80 2a 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  * journal might 
2ca90 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e  not yet be open.
2caa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2cab0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
2cac0 69 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50  in(pPager, 0, pP
2cad0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
2cae0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ry);.    if( rc!
2caf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cb00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2cb10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
2cb20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2cb30 29 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  ) .     && pPage
2cb40 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
2cb50 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2cb60 45 5f 4f 46 46 20 0a 20 20 20 20 20 26 26 20 21  E_OFF .     && !
2cb70 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2cb80 65 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  er).    ){.     
2cb90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2cba0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2cbb0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2cbc0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
2cbd0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
2cbe0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2cbf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2cc00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
2cc10 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a  odified = 1;.  .
2cc20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
2cc30 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
2cc40 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
2cc50 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
2cc60 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
2cc70 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
2cc80 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
2cc90 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
2cca0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
2ccb0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
2ccc0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
2ccd0 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
2cce0 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
2ccf0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61    */.    if( !pa
2cd00 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
2cd10 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2cd20 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
2cd30 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
2cd40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
2cd50 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
2cd60 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
2cd70 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
2cd80 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20      u32 cksum;. 
2cd90 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
2cda0 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ta2;..        /*
2cdb0 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
2cdc0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
2cdd0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
2cde0 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
2cdf0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
2ce00 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
2ce10 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2ce20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
2ce30 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
2ce40 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
2ce50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2ce60 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
2ce70 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
2ce80 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
2ce90 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
2cea0 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
2ceb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
2cec0 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
2ced0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
2cee0 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
2cef0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
2cf00 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
2cf10 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
2cf20 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
2cf30 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  *)pData2);.     
2cf40 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
2cf50 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
2cf60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2cf70 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
2cf80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2cf90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cfa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2cfb0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2cfc0 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
2cfd0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2cfe0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d000 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d010 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20  Off + 4);.      
2d020 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2d030 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
2d040 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20  ->pageSize+4;.  
2d050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d060 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2d080 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
2d090 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
2d0a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
2d0b0 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
2d0c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2d0d0 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
2d0e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
2d0f0 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
2d100 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
2d110 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2d120 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2d130 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2d140 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  nalOff, pPager->
2d150 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  pageSize));.    
2d160 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
2d170 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2d180 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  tej_count);.    
2d190 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2d1a0 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
2d1b0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
2d1c0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
2d1d0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
2d1e0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2d1f0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
2d200 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
2d210 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2d220 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
2d230 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
2d240 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  ..        /* Eve
2d250 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69  n if an IO or di
2d260 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63  skfull error occ
2d270 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72  urred while jour
2d280 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20  nalling the.    
2d290 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
2d2a0 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
2d2b0 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
2d2c0 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
2d2d0 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  age..        ** 
2d2e0 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20  Otherwise, when 
2d2f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2d300 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
2d310 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20  the logic in.   
2d320 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b       ** playback
2d330 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
2d340 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
2d350 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
2d360 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20   restored.      
2d370 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
2d380 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
2d390 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
2d3a0 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
2d3b0 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20   so,.        ** 
2d3c0 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20  then corruption 
2d3d0 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20  may follow..    
2d3e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2d3f0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
2d400 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2d410 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
2d420 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
2d430 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2d440 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
2d450 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2d460 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
2d470 73 20 6f 63 63 75 72 72 65 64 20 77 72 69 74 69  s occurred writi
2d480 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
2d490 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20  l file. The .   
2d4a0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
2d4b0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
2d4c0 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
2d4d0 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
2d4e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2d4f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2d510 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2d520 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67   }..        pPag
2d530 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
2d540 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2d550 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
2d560 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2d570 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
2d580 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
2d590 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
2d5a0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2d5b0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
2d5c0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
2d5d0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2d5e0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
2d5f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
2d600 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54        rc |= addT
2d610 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
2d620 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
2d630 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
2d640 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
2d660 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2d670 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
2d680 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2d6a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
2d6b0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
2d6c0 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
2d6d0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2d6e0 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
2d6f0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
2d700 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
2d710 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
2d720 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
2d730 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
2d740 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64  RACE(("APPEND %d
2d750 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
2d760 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
2d770 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
2d780 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2d790 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
2d7a0 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
2d7b0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2d7c0 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20  )?1:0)));.      
2d7d0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
2d7e0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
2d7f0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
2d800 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
2d810 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
2d820 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
2d830 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2d840 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
2d850 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
2d860 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
2d870 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
2d880 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
2d890 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
2d8a0 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
2d8b0 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
2d8c0 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
2d8d0 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
2d8e0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
2d8f0 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75      if( subjRequ
2d900 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
2d910 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
2d920 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
2d930 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2d940 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
2d950 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
2d960 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  turn..  */.  ass
2d970 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2d980 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
2d990 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2d9a0 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
2d9b0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
2d9c0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
2d9d0 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
2d9e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2d9f0 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
2da00 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
2da10 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
2da20 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
2da30 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61  e .** making cha
2da40 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20  nges to a page. 
2da50 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
2da60 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
2da70 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68   value .** of th
2da80 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
2da90 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
2daa0 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  o change any pag
2dab0 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a  e data unless .*
2dac0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
2dad0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2dae0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
2daf0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
2db00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
2db10 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
2db20 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
2db30 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
2db40 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
2db50 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
2db60 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
2db70 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
2db80 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
2db90 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
2dba0 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
2dbb0 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
2dbc0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
2dbd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2dbe0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2dbf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2dc00 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
2dc10 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49  TE_NOMEM or an I
2dc20 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2dc30 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61  returned.** as a
2dc40 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65  ppropriate. Othe
2dc50 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
2dc60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2dc70 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
2dc80 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
2dc90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2dca0 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
2dcb0 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
2dcc0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2dcd0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
2dce0 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
2dcf0 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
2dd00 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
2dd10 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  ageSize);..  if(
2dd20 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
2dd30 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
2dd40 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
2dd50 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
2dd60 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
2dd70 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2dd80 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
2dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dda0 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
2ddb0 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
2ddc0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
2ddd0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20      int nPage;  
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ddf0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2de00 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
2de10 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
2de20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
2de30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2de40 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2de50 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
2de60 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
2de70 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
2de80 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
2de90 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a  _SYNC */..    /*
2dea0 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
2deb0 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  nc flag to 1. Th
2dec0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
2ded0 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20   cannot allow a 
2dee0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68  journal.    ** h
2def0 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
2df00 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
2df10 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
2df20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
2df30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2df40 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
2df50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2df60 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
2df70 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2df80 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
2df90 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
2dfa0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
2dfb0 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
2dfc0 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
2dfd0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
2dfe0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
2dff0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
2e000 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
2e010 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
2e020 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
2e030 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
2e040 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
2e050 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
2e060 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
2e070 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
2e080 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
2e090 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2e0a0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
2e0b0 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26  pPager, (int *)&
2e0c0 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20  nPageCount);.   
2e0d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2e0e0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50 67   rc;.    if( pPg
2e0f0 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e  ->pgno>nPageCoun
2e100 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
2e110 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
2e120 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  pg1)+1;.    }els
2e130 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65  e if( (pg1+nPage
2e140 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61  PerSector-1)>nPa
2e150 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
2e160 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f   nPage = nPageCo
2e170 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d  unt+1-pg1;.    }
2e180 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67  else{.      nPag
2e190 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74  e = nPagePerSect
2e1a0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
2e1b0 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20  sert(nPage>0);. 
2e1c0 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70     assert(pg1<=p
2e1d0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61  Pg->pgno);.    a
2e1e0 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65  ssert((pg1+nPage
2e1f0 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  )>pPg->pgno);.. 
2e200 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2e210 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c  nPage && rc==SQL
2e220 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20  ITE_OK; ii++){. 
2e230 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70       Pgno pg = p
2e240 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48  g1+ii;.      PgH
2e250 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20  dr *pPage;.     
2e260 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67   if( pg==pPg->pg
2e270 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69  no || !sqlite3Bi
2e280 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
2e290 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29  >pInJournal, pg)
2e2a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2e2b0 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  pg!=PAGER_MJ_PGN
2e2c0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
2e2d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2e2e0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
2e2f0 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b  er, pg, &pPage);
2e300 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2e310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e320 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2e330 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61   pager_write(pPa
2e340 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2e350 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
2e360 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2e370 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  C ){.           
2e380 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
2e390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
2e3a0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65  ssert(pPager->ne
2e3b0 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20  edSync);.       
2e3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e3d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2e3e0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
2e3f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e400 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2e410 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65  f( (pPage = page
2e420 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
2e430 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20   pg))!=0 ){.    
2e440 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
2e450 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2e460 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
2e470 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
2e480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e490 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2e4a0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
2e4b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2e4c0 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e  * If the PGHDR_N
2e4d0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
2e4e0 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20   set for any of 
2e4f0 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  the nPage pages 
2e500 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
2e510 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74   at pg1, then it
2e520 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74   needs to be set
2e530 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d   for all of them
2e540 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  . Because.    **
2e550 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
2e560 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70  of these nPage p
2e570 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20  ages may damage 
2e580 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a  the others, the.
2e590 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
2e5a0 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ile must contain
2e5b0 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73   sync()ed copies
2e5c0 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a   of all of them.
2e5d0 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e      ** before an
2e5e0 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65  y of them can be
2e5f0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
2e600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e610 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2e620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e630 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  && needSync ){. 
2e640 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
2e650 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  MDB && pPager->n
2e660 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  oSync==0 );.    
2e670 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
2e680 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
2e690 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
2e6a0 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
2e6b0 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
2e6c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
2e6d0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
2e6e0 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d   pPage->flags |=
2e6f0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2e700 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2e710 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2e720 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
2e730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2e740 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
2e750 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20  dSync);.    }.. 
2e760 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e770 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20  r->doNotSync==1 
2e780 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2e790 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20  oNotSync = 0;.  
2e7a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2e7b0 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
2e7c0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
2e7d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e7e0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2e7f0 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
2e800 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
2e810 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
2e820 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
2e830 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
2e840 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2e850 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
2e860 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
2e870 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
2e880 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
2e890 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2e8a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2e8b0 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
2e8c0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
2e8d0 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  rn pPg->flags&PG
2e8e0 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e  HDR_DIRTY;.}.#en
2e8f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
2e900 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
2e910 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
2e920 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
2e930 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
2e940 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
2e950 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70  mation on page p
2e960 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  Pg back to the d
2e970 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
2e980 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
2e990 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
2e9a0 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61   dirty.  This ha
2e9b0 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
2e9c0 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  le, when.** the 
2e9d0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64  page has been ad
2e9e0 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66  ded as a leaf of
2e9f0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2ea00 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74  d so its.** cont
2ea10 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61  ent no longer ma
2ea20 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tters..**.** The
2ea30 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
2ea40 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
2ea50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
2ea60 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
2ea70 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
2ea80 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
2ea90 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b  . The pager mark
2eaa0 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
2eab0 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
2eac0 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
2ead0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
2eae0 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
2eaf0 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
2eb00 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64  ization can quad
2eb10 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
2eb20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c  of large .** DEL
2eb30 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ETE operations..
2eb40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
2eb50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67  agerDontWrite(Pg
2eb60 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
2eb70 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
2eb80 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
2eb90 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2eba0 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67  R_DIRTY) && pPag
2ebb0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
2ebc0 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  0 ){.    PAGERTR
2ebd0 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE(("DONT_WRITE
2ebe0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
2ebf0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
2ec00 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
2ec10 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43  .    IOTRACE(("C
2ec20 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
2ec30 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2ec40 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  )).    pPg->flag
2ec50 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f  s |= PGHDR_DONT_
2ec60 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51  WRITE;.#ifdef SQ
2ec70 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
2ec80 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
2ec90 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
2eca0 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
2ecb0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2ecc0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2ecd0 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
2ece0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
2ecf0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ed00 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e   .** change-coun
2ed10 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ter, stored as a
2ed20 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
2ed30 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74  an integer start
2ed40 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20  ing at .** byte 
2ed50 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
2ed60 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a   pager file..**.
2ed70 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72 65  ** If the isDire
2ed80 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a  ctMode flag is z
2ed90 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ero, then this i
2eda0 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e  s done by callin
2edb0 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  g .** sqlite3Pag
2edc0 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67  erWrite() on pag
2edd0 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79  e 1, then modify
2ede0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
2edf0 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
2ee00 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61  data. In this ca
2ee10 73 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  se the file will
2ee20 20 62 65 20 75 70 64 61 74 65 64 20 77 68 65 6e   be updated when
2ee30 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2ee40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2ee50 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
2ee60 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  The isDirectMode
2ee70 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62   flag may only b
2ee80 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  e non-zero if th
2ee90 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f  e library was co
2eea0 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74  mpiled.** with t
2eeb0 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
2eec0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61  _ATOMIC_WRITE ma
2eed0 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20  cro defined. In 
2eee0 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66  this case,.** if
2eef0 20 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e   isDirect is non
2ef00 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
2ef10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2ef20 20 75 70 64 61 74 65 64 20 64 69 72 65 63 74 6c   updated directl
2ef30 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20  y.** by writing 
2ef40 61 6e 20 75 70 64 61 74 65 64 20 76 65 72 73 69  an updated versi
2ef50 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73 69  on of page 1 usi
2ef60 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65  ng a call to the
2ef70 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72   .** sqlite3OsWr
2ef80 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ite() function..
2ef90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2efa0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2efb0 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50  ounter(Pager *pP
2efc0 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65  ager, int isDire
2efd0 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72  ctMode){.  int r
2efe0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2eff0 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64    /* Declare and
2f000 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73   initialize cons
2f010 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73  tant integer 'is
2f020 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a  Direct'. If the.
2f030 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74    ** atomic-writ
2f040 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2f050 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69  s enabled in thi
2f060 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73  s build, then is
2f070 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69  Direct.  ** is i
2f080 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
2f090 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
2f0a0 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  s the isDirectMo
2f0b0 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  de parameter.  *
2f0c0 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
2f0d0 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  on. Otherwise, i
2f0e0 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  t is always set 
2f0f0 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  to zero..  **.  
2f100 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
2f110 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69  hat if the atomi
2f120 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2f130 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  tion is not.  **
2f140 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
2f150 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f  ile time, the co
2f160 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20  mpiler can omit 
2f170 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a  the tests of.  *
2f180 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c  * 'isDirect' bel
2f190 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74  ow, as well as t
2f1a0 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65  he block enclose
2f1b0 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69  d in the.  ** "i
2f1c0 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63  f( isDirect )" c
2f1d0 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  ondition..  */.#
2f1e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
2f1f0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2f200 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  E.# define DIREC
2f210 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72  T_MODE 0.  asser
2f220 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d  t( isDirectMode=
2f230 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =0 );.  UNUSED_P
2f240 41 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63  ARAMETER(isDirec
2f250 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20  tMode);.#else.# 
2f260 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
2f270 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a  DE isDirectMode.
2f280 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
2f290 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2f2a0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
2f2b0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
2f2c0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2f2d0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  e && pPager->dbS
2f2e0 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  ize>0 ){.    PgH
2f2f0 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20  dr *pPgHdr;     
2f300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f310 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
2f320 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61  1 */.    u32 cha
2f330 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20  nge_counter;    
2f340 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2f350 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67  l value of chang
2f360 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2f370 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
2f380 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2f390 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  e && isOpen(pPag
2f3a0 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20  er->fd) );..    
2f3b0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
2f3c0 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
2f3d0 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
2f3e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f3f0 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
2f400 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73  pPgHdr);.    ass
2f410 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c  ert( pPgHdr==0 |
2f420 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
2f430 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61  );..    /* If pa
2f440 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68  ge one was fetch
2f450 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
2f460 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
2f470 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a  on is not.    **
2f480 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69   operating in di
2f490 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20  rect-mode, make 
2f4a0 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e  page 1 writable.
2f4b0 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20    When not in . 
2f4c0 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64     ** direct mod
2f4d0 65 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c 77  e, page 1 is alw
2f4e0 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68  ays held in cach
2f4f0 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  e and hence the 
2f500 50 61 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a  PagerGet().    *
2f510 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79  * above is alway
2f520 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68  s successful - h
2f530 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53 20  ence the ALWAYS 
2f540 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  on rc==SQLITE_OK
2f550 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2f560 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26   !DIRECT_MODE &&
2f570 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49   ALWAYS(rc==SQLI
2f580 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
2f590 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f5a0 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a  rWrite(pPgHdr);.
2f5b0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
2f5c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f5d0 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
2f5e0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
2f5f0 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
2f600 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
2f610 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68   24. */.      ch
2f620 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
2f630 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
2f640 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
2f650 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63  leVers);.      c
2f660 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
2f670 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73  .      put32bits
2f680 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d  (((char*)pPgHdr-
2f690 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
2f6a0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
2f6b0 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72      /* Also stor
2f6c0 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72  e the SQLite ver
2f6d0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62  sion number in b
2f6e0 79 74 65 73 20 39 36 2e 2e 39 39 20 2a 2f 0a 20  ytes 96..99 */. 
2f6f0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
2f700 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
2f710 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45  Data)+96, SQLITE
2f720 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29  _VERSION_NUMBER)
2f730 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ;..      /* If r
2f740 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74  unning in direct
2f750 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65   mode, write the
2f760 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
2f770 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  e 1 to the file.
2f780 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49   */.      if( DI
2f790 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20  RECT_MODE ){.   
2f7a0 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
2f7b0 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e  *zBuf = pPgHdr->
2f7c0 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 61  pData;.        a
2f7d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
2f7e0 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20  bFileSize>0 );. 
2f7f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f800 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
2f810 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
2f820 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30  ger->pageSize, 0
2f830 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f840 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f850 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2f860 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2f870 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  e = 1;.        }
2f880 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f890 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68        pPager->ch
2f8a0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2f8b0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2f8c0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
2f8d0 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
2f8e0 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
2f8f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2f900 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  gHdr);.  }.  ret
2f910 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f920 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20   Sync the pager 
2f930 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68  file to disk. Th
2f940 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  is is a no-op fo
2f950 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  r in-memory file
2f960 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69  s.** or pages wi
2f970 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  th the Pager.noS
2f980 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ync flag set..**
2f990 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2f9a0 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20  l, or called on 
2f9b0 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  a pager for whic
2f9c0 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c  h it is a no-op,
2f9d0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
2f9e0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
2f9f0 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
2fa00 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2fa10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2fa20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2fa30 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  rSync(Pager *pPa
2fa40 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
2fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fa70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2fa80 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2fa90 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2faa0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
2fab0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2fac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2fad0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
2fae0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
2faf0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
2fb00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2fb10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
2fb20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fb30 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
2fb40 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
2fb50 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
2fb60 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
2fb70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
2fb80 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
2fb90 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
2fba0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
2fbb0 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
2fbc0 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
2fbd0 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
2fbe0 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
2fbf0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
2fc00 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
2fc10 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
2fc20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2fc30 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a  ensures that:.**
2fc40 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
2fc50 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
2fc60 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61  -counter is upda
2fc70 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20  ted,.**   * the 
2fc80 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
2fc90 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74  d (unless the at
2fca0 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2fcb0 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29  ization is used)
2fcc0 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72  ,.**   * all dir
2fcd0 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69  ty pages are wri
2fce0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
2fcf0 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20  base file, .**  
2fd00 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
2fd10 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
2fd20 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c  d (if required),
2fd30 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20   and.**   * the 
2fd40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
2fd50 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  nced. .**.** The
2fd60 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
2fd70 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
2fd80 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
2fd90 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a  on is to finaliz
2fda0 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74  e .** (delete, t
2fdb0 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
2fdc0 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f  the first part o
2fdd0 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  f) the journal f
2fde0 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65  ile (or .** dele
2fdf0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
2fe00 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
2fe10 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
2fe20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
2fe30 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
2fe40 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
2fe50 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
2fe60 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
2fe70 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
2fe80 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
2fe90 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
2fea0 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   the final param
2feb0 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20  eter - noSync - 
2fec0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
2fed0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fee0 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74  itself.** is not
2fef0 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c   synced. The cal
2ff00 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71  ler must call sq
2ff10 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29  lite3PagerSync()
2ff20 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
2ff30 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
2ff40 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  e file before ca
2ff50 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73  lling CommitPhas
2ff60 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65  eTwo() to delete
2ff70 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2ff80 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
2ff90 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2ffa0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
2ffb0 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70  eOne(.  Pager *p
2ffc0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
2ffd0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
2ffe0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
2fff0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
30000 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30010 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
30020 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
30030 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  name */.  int no
30040 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
30050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30060 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53  e to omit the xS
30070 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ync on the db fi
30080 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
30090 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
300a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
300b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
300c0 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a  /* The dbOrigSiz
300d0 65 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 69  e is never set i
300e0 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f  f journal_mode=O
300f0 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  FF */.  assert( 
30100 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
30110 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
30120 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 50  ALMODE_OFF || pP
30130 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
30140 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
30150 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63  a prior error oc
30160 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74  curred, report t
30170 68 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e  hat error again.
30180 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
30190 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
301a0 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
301b0 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41  ->errCode;..  PA
301c0 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42  GERTRACE(("DATAB
301d0 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
301e0 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69  s zMaster=%s nSi
301f0 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ze=%d\n", .     
30200 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
30210 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  me, zMaster, pPa
30220 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a  ger->dbSize));..
30230 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70    if( MEMDB && p
30240 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
30250 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  d ){.    /* If t
30260 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
30270 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
30280 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
30290 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
302a0 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  s.    ** functio
302b0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
302c0 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
302d0 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e   mostly a no-op.
302e0 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20    However, any. 
302f0 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20     ** backup in 
30300 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74  progress needs t
30310 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  o be restarted..
30320 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
30330 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
30340 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
30350 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
30360 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
30370 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50 61  ER_SYNCED && pPa
30380 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
30390 29 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ){.    if( pager
303a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
303b0 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
303c0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
303d0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
303e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
303f0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
30400 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
30410 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70  pagerWalFrames(p
30420 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50  Pager, pList, pP
30430 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c  ager->dbSize, 1,
30440 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
30450 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
30460 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  ? pPager->sync_f
30470 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20 20  lags : 0).      
30480 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
30490 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
304a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
304b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
304c0 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
304d0 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Cache);.      }.
304e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
304f0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
30500 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20  g block updates 
30510 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
30520 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  er. Exactly how 
30530 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  it.      ** does
30540 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e   this depends on
30550 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
30560 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74  the atomic-updat
30570 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  e optimization. 
30580 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62       ** was enab
30590 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
305a0 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73  ime, and if this
305b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65   transaction mee
305c0 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ts the .      **
305d0 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69   runtime criteri
305e0 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65  a to use the ope
305f0 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a  ration: .      *
30600 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20  *.      **    * 
30610 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
30620 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f  supports the ato
30630 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
30640 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ty for.      ** 
30650 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73       blocks of s
30660 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  ize page-size, a
30670 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  nd .      **    
30680 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73  * This commit is
30690 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d   not part of a m
306a0 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
306b0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
306c0 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79   **    * Exactly
306d0 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65   one page has be
306e0 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20  en modified and 
306f0 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  store in the jou
30700 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
30710 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
30720 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
30730 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64   was not enabled
30740 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
30750 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
30760 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
30770 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66  hangecounter() f
30780 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
30790 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
307a0 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20  change.      ** 
307b0 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69  counter in 'indi
307c0 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74  rect-mode'. If t
307d0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
307e0 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62  is compiled in b
307f0 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  ut.      ** is n
30800 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f  ot applicable to
30810 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
30820 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a  n, call sqlite3J
30830 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20  ournalCreate(). 
30840 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20       ** to make 
30850 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sure the journal
30860 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c   file has actual
30870 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  ly been created,
30880 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20   then call.     
30890 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
308a0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
308b0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
308c0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69  nge-counter in i
308d0 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  ndirect.      **
308e0 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a   mode. .      **
308f0 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  .      ** Otherw
30900 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69  ise, if the opti
30910 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68  mization is both
30920 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70   enabled and app
30930 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a  licable,.      *
30940 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65  * then call page
30950 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
30960 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
30970 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
30980 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ter.      ** in 
30990 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49  'direct' mode. I
309a0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
309b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
309c0 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20 20  l never be.     
309d0 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
309e0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
309f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66  ..      */.  #if
30a00 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
30a10 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
30a20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
30a30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
30a40 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
30a50 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  d) || pPager->jo
30a60 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
30a70 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
30a80 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   );.      if( !z
30a90 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e  Master && isOpen
30aa0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20  (pPager->jfd) . 
30ab0 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
30ac0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
30ad0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
30ae0 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 70  er) .       && p
30af0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70  Pager->dbSize>=p
30b00 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
30b10 65 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d  e.       && (0==
30b20 28 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63  (pPg = sqlite3Pc
30b30 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
30b40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20  ager->pPCache)) 
30b50 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74  || 0==pPg->pDirt
30b60 79 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  y).      ){.    
30b70 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
30b80 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65  e db file change
30b90 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65   counter via the
30ba0 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65   direct-write me
30bb0 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20  thod. The .     
30bc0 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
30bd0 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79  call will modify
30be0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
30bf0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
30c00 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 20   page 1 .       
30c10 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74   ** to include t
30c20 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67  he updated chang
30c30 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68  e counter and th
30c40 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20  en write page 1 
30c50 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72 65  .        ** dire
30c60 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61  ctly to the data
30c70 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75  base file. Becau
30c80 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63  se of the atomic
30c90 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 20 20  -write .        
30ca0 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  ** property of t
30cb0 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73  he host file-sys
30cc0 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66  tem, this is saf
30cd0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
30ce0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30cf0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
30d00 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ter(pPager, 1);.
30d10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30d20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30d30 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70  3JournalCreate(p
30d40 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
30d50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30d70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
30d80 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
30d90 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  r(pPager, 0);.  
30da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30db0 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63    #else.      rc
30dc0 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
30dd0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
30de0 65 72 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66  er, 0);.  #endif
30df0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
30e00 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
30e10 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
30e20 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20  _exit;.  .      
30e30 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73  /* If this trans
30e40 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  action has made 
30e50 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61  the database sma
30e60 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70  ller, then all p
30e70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 62 65  ages.      ** be
30e80 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
30e90 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
30ea0 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
30eb0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
30ec0 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68       ** file. Th
30ed0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
30ee0 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
30ef0 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a  m mode..      **
30f00 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65  .      ** Before
30f10 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61 67   reading the pag
30f20 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  es with page num
30f30 62 65 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e  bers larger than
30f40 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
30f50 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
30f60 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73 65  Pager.dbSize, se
30f70 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74 6f  t dbSize back to
30f80 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
30f90 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b   ** that it took
30fa0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
30fb0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
30fc0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
30fd0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  .      ** calls 
30fe0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  to sqlite3PagerG
30ff0 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f  et() return zero
31000 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64  ed pages instead
31010 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   of .      ** re
31020 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20  ading data from 
31030 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31040 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
31050 20 20 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61    ** When journa
31060 6c 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20  l_mode==OFF the 
31070 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 6c  dbOrigSize is al
31080 77 61 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68  ways zero, so th
31090 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  is.      ** bloc
310a0 6b 20 6e 65 76 65 72 20 72 75 6e 73 20 69 66 20  k never runs if 
310b0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46  journal_mode=OFF
310c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66  ..      */.  #if
310d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
310e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
310f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
31100 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f  Size<pPager->dbO
31110 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 20 20  rigSize .       
31120 26 26 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  && ALWAYS(pPager
31130 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
31140 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
31150 5f 4f 46 46 29 0a 20 20 20 20 20 20 29 7b 0a 20  _OFF).      ){. 
31160 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20         Pgno i;  
31170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31190 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
311a0 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  iable */.       
311b0 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69   const Pgno iSki
311c0 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  p = PAGER_MJ_PGN
311d0 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65  O(pPager); /* Pe
311e0 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20  nding lock page 
311f0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
31200 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70   Pgno dbSize = p
31210 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20  Pager->dbSize;  
31220 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
31230 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a   image size */ .
31240 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
31250 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
31260 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20  >dbOrigSize;.   
31270 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69       for( i=dbSi
31280 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d  ze+1; i<=pPager-
31290 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b  >dbOrigSize; i++
312a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
312b0 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  ( !sqlite3Bitvec
312c0 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
312d0 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69  Journal, i) && i
312e0 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
312f0 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
31300 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
31310 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72   /* Page to jour
31320 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nal */.         
31330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31340 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
31350 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  i, &pPage);.    
31360 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
31370 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
31380 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
31390 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  e_exit;.        
313a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
313b0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
313c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
313d0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
313e0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
313f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31400 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
31410 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
31420 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
31430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31440 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
31450 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20  e = dbSize;.    
31460 20 20 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20 20    } .  #endif.  
31470 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
31480 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
31490 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
314a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
314b0 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20  f a master .    
314c0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
314d0 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
314e0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
314f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
31500 69 6c 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ile, .      ** o
31510 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20  r if zMaster is 
31520 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20  NULL (no master 
31530 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74  journal), then t
31540 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
31550 2d 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  -op..      */.  
31560 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
31570 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
31580 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
31590 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
315a0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
315b0 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
315c0 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  it;.  .      /* 
315d0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
315e0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74   file. If the at
315f0 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69  omic-update opti
31600 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  mization is bein
31610 67 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2c  g.      ** used,
31620 20 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20   this call will 
31630 6e 6f 74 20 63 72 65 61 74 65 20 74 68 65 20 6a  not create the j
31640 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70  ournal file or p
31650 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20 20  erform any.     
31660 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20   ** real IO..   
31670 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
31680 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
31690 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
316a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
316b0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
316c0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20  e_one_exit;.  . 
316d0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c       /* Write al
316e0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
316f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31700 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  le. */.      rc 
31710 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
31720 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63  gelist(sqlite3Pc
31730 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
31740 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b  ager->pPCache));
31750 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
31760 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31770 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
31780 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
31790 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  CKED );.        
317a0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
317b0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
317c0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
317d0 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
317e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
317f0 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  ;.  .      /* If
31800 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
31810 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d  k is not the sam
31820 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64 61  e size as the da
31830 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20  tabase image,.  
31840 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20      ** then use 
31850 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74  pager_truncate t
31860 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b  o grow or shrink
31870 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a   the file here..
31880 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31890 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
318a0 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e!=pPager->dbFil
318b0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
318c0 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61   Pgno nNew = pPa
318d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70  ger->dbSize - (p
318e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
318f0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
31900 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 61  ger));.        a
31910 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
31920 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
31930 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20 20  USIVE );.       
31940 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
31950 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65  cate(pPager, nNe
31960 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
31970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
31980 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
31990 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
319a0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
319b0 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68  Finally, sync th
319c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
319d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
319e0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26  Pager->noSync &&
319f0 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20   !noSync ){.    
31a00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31a10 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
31a20 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
31a30 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a  flags);.      }.
31a40 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
31a50 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  DBSYNC %p\n", pP
31a60 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 0a 20 20  ager)).    }..  
31a70 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
31a80 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a  = PAGER_SYNCED;.
31a90 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73    }..commit_phas
31aa0 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65  e_one_exit:.  re
31ab0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
31ac0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
31ad0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
31ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31af0 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70  le has been comp
31b00 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65  letely.** update
31b10 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  d to reflect the
31b20 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
31b30 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
31b40 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  nsaction and.** 
31b50 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
31b60 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
31b70 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e   still exists in
31b80 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
31b90 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64   .** though, and
31ba0 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
31bb0 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
31bc0 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74  nt it will event
31bd0 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64  ually.** be used
31be0 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
31bf0 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  l and the curren
31c00 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  t transaction ro
31c10 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
31c20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
31c30 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75  inalizes the jou
31c40 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65  rnal file, eithe
31c50 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a  r by deleting, .
31c60 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72  ** truncating or
31c70 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69   partially zeroi
31c80 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69  ng it, so that i
31c90 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  t cannot be used
31ca0 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75   .** for hot-jou
31cb0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f  rnal rollback. O
31cc0 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65  nce this is done
31cd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
31ce0 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62   is.** irrevocab
31cf0 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  ly committed..**
31d00 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
31d10 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72  occurs, an IO er
31d20 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
31d30 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
31d40 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f  er.** moves into
31d50 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
31d60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
31d70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
31d80 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
31d90 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
31da0 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
31db0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
31dc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
31dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31de0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
31df0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
31e00 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
31e10 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69 6f  called if a prio
31e20 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  r error has occu
31e30 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69  rred..  ** But i
31e40 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64 69  f (due to a codi
31e50 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68 65  ng error elsewhe
31e60 72 65 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d  re in the system
31e70 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20 20  ) it does get.  
31e80 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20  ** called, just 
31e90 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
31ea0 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68 6f  error code witho
31eb0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
31ec0 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  g. */.  if( NEVE
31ed0 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
31ee0 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
31ef0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
31f00 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
31f10 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
31f20 61 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61 67  alled if the pag
31f30 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20  er is not in at 
31f40 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52  least.  ** PAGER
31f50 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
31f60 20 41 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69   And indeed SQLi
31f70 74 65 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68  te never does th
31f80 69 73 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20  is. But it is.  
31f90 2a 2a 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20  ** nice to have 
31fa0 74 68 69 73 20 64 65 66 65 6e 73 69 76 65 20 74  this defensive t
31fb0 65 73 74 20 68 65 72 65 20 61 6e 79 77 61 79 2e  est here anyway.
31fc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
31fd0 52 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  R(pPager->state<
31fe0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 29 20  PAGER_RESERVED) 
31ff0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
32000 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20  ERROR;..  /* An 
32010 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66  optimization. If
32020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
32030 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
32040 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20  odified during. 
32050 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
32060 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20  tion, the pager 
32070 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
32080 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64  clusive-mode and
32090 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70   is.  ** using p
320a0 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
320b0 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ls, then this fu
320c0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
320d0 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  p..  **.  ** The
320e0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
320f0 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
32100 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  ntly contains a 
32110 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a  single journal .
32120 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68    ** header with
32130 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
32140 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63  set to 0. If suc
32150 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75  h a journal is u
32160 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f  sed as.  ** a ho
32170 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67  t-journal during
32180 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
32190 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73  lback, 0 changes
321a0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20   will be made.  
321b0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
321c0 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72  se file. So ther
321d0 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
321e0 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  zero the journal
321f0 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53   .  ** header. S
32200 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
32210 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
32220 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ode, there is no
32230 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72   need.  ** to dr
32240 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74  op any locks eit
32250 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
32260 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
32270 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ed==0 && pPager-
32280 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
32290 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
322a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
322b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
322c0 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73  SIST.  ){.    as
322d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
322e0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
322f0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
32300 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
32310 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
32320 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f   PAGERTRACE(("CO
32330 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
32340 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
32350 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32360 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
32370 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  NCED || MEMDB ||
32380 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
32390 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70  fied );.  rc = p
323a0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
323b0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
323c0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
323d0 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
323e0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
323f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
32400 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
32410 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
32420 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
32430 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
32440 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
32450 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f  ion performs two
32460 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   tasks:.**.**   
32470 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b  1) It rolls back
32480 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32490 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c  e, restoring all
324a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
324b0 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d  nd .**      in-m
324c0 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
324d0 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  s to the state t
324e0 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e  hey were in when
324f0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
32500 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65  .**      was ope
32510 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29  ned, and.**   2)
32520 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68   It finalizes th
32530 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
32540 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  so that it is no
32550 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a  t used for hot.*
32560 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20  *      rollback 
32570 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20  at any point in 
32580 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a  the future..**.*
32590 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  * subject to the
325a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69   following quali
325b0 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  fications:.**.**
325c0 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
325d0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65  l file is not ye
325e0 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  t open when this
325f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
32600 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f  led,.**   then o
32610 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f  nly (2) is perfo
32620 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rmed. In this ca
32630 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a  se there is no j
32640 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
32650 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a   to roll back..*
32660 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20  *.** * If in an 
32670 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
32680 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
32690 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31  LL, then task (1
326a0 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f  ) is .**   perfo
326b0 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73  rmed. If success
326c0 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52  ful, task (2). R
326d0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
326e0 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66   outcome.**   of
326f0 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72   either, the err
32700 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
32710 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
32720 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a  to the caller.**
32730 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20     (i.e. either 
32740 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
32750 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
32760 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20  .**.** * If the 
32770 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
32780 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
32790 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28  , then attempt (
327a0 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20  1). Whether.**  
327b0 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73   or not (1) is s
327c0 75 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20  uccussful, also 
327d0 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20  attempt (2). If 
327e0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
327f0 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f  rn.**   SQLITE_O
32800 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e  K. Otherwise, en
32810 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
32820 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
32830 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65  he first .**   e
32840 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e  rror code encoun
32850 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  tered. .**.**   
32860 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
32870 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
32880 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
32890 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  e was written to
328a0 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61  . .**   So is sa
328b0 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  fe to finalize t
328c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
328d0 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79  even if the play
328e0 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72  back .**   (oper
328f0 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e  ation 1) failed.
32900 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67   However the pag
32910 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68  er must enter th
32920 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a  e error state.**
32930 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e     as the conten
32940 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  ts of the in-mem
32950 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f  ory cache are no
32960 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a  w suspect..**.**
32970 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69   * Finally, if i
32980 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  n PAGER_EXCLUSIV
32990 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  E state, then at
329a0 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a  tempt (1). Only.
329b0 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29  **   attempt (2)
329c0 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65   if (1) is succe
329d0 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51  ssful. Return SQ
329e0 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
329f0 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65  ssful,.**   othe
32a00 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20  rwise enter the 
32a10 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
32a20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
32a30 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a   code from the .
32a40 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65  **   failing ope
32a50 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ration..**.**   
32a60 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
32a70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
32a80 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  ay have been wri
32a90 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74  tten to. So if t
32aa0 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b  he.**   playback
32ab0 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   operation did n
32ac0 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f  ot succeed it wo
32ad0 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20  uld not be safe 
32ae0 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20  to finalize.**  
32af0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32b00 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62  e. It needs to b
32b10 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
32b20 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61  le-system so tha
32b30 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65  t.**   some othe
32b40 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73  r process can us
32b50 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20  e it to restore 
32b60 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61  the database sta
32b70 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d  te (by.**   hot-
32b80 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
32b90 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
32ba0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
32bb0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
32bc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
32bd0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
32be0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
32bf0 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54  code */.  PAGERT
32c00 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE(("ROLLBACK 
32c10 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
32c20 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20  Pager)));.  if( 
32c30 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
32c40 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  er) ){.    int r
32c50 63 32 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  c2;..    rc = sq
32c60 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
32c70 69 6e 74 28 70 50 61 67 65 72 2c 20 53 41 56 45  int(pPager, SAVE
32c80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
32c90 2d 31 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70  -1);.    rc2 = p
32ca0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
32cb0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
32cc0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
32cd0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
32ce0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
32cf0 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
32d00 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
32d10 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  rc);.  }else if(
32d20 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
32d30 66 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28  fied || !isOpen(
32d40 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
32d50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
32d60 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
32d70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
32d80 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c  etMaster);.  }el
32d90 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
32da0 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
32db0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
32dc0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  E_FULL ){.    if
32dd0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
32de0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
32df0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
32e00 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
32e10 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
32e20 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
32e30 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
32e40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
32e50 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
32e60 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  VED ){.      int
32e70 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d   rc2;.      rc =
32e80 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
32e90 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
32ea0 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e    rc2 = pager_en
32eb0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
32ec0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
32ed0 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  tMaster);.      
32ee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32ef0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
32f00 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
32f10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32f20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
32f30 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
32f40 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
32f50 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
32f60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
32f70 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  id = 0;.    }.. 
32f80 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
32f90 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
32fa0 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63  a ROLLBACK, we c
32fb0 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75  an no longer tru
32fc0 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  st the pager.   
32fd0 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
32fe0 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
32ff0 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
33000 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
33010 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73  r .    ** persis
33020 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tent..    */.   
33030 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
33040 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
33050 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
33060 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33070 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
33080 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
33090 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
330a0 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
330b0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
330c0 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
330d0 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73  ritable..*/.u8 s
330e0 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
330f0 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
33100 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
33110 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
33120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
33130 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
33140 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
33150 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
33160 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
33170 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
33180 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
33190 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
331a0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
331b0 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  he);.}../*.** Re
331c0 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 78 69  turn the approxi
331d0 6d 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62  mate number of b
331e0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 63  ytes of memory c
331f0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  urrently.** used
33200 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61 6e   by the pager an
33210 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64  d its associated
33220 20 63 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73   cache..*/.int s
33230 71 6c 69 74 65 33 50 61 67 65 72 4d 65 6d 55 73  qlite3PagerMemUs
33240 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
33250 29 7b 0a 20 20 69 6e 74 20 70 65 72 50 61 67 65  ){.  int perPage
33260 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
33270 61 67 65 53 69 7a 65 20 2b 20 70 50 61 67 65 72  ageSize + pPager
33280 2d 3e 6e 45 78 74 72 61 20 2b 20 32 30 3b 0a 20  ->nExtra + 20;. 
33290 20 72 65 74 75 72 6e 20 70 65 72 50 61 67 65 53   return perPageS
332a0 69 7a 65 2a 73 71 6c 69 74 65 33 50 63 61 63 68  ize*sqlite3Pcach
332b0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
332c0 72 2d 3e 70 50 43 61 63 68 65 29 0a 20 20 20 20  r->pPCache).    
332d0 20 20 20 20 20 20 20 2b 20 73 71 6c 69 74 65 33         + sqlite3
332e0 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 50 61 67 65  MallocSize(pPage
332f0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  r);.}../*.** Ret
33300 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
33310 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
33320 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
33330 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
33340 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
33350 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67  unt(DbPage *pPag
33360 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
33370 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
33380 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d  fcount(pPage);.}
33390 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
333a0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
333b0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
333c0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
333d0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
333e0 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
333f0 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
33400 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
33410 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
33420 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [0] = sqlite3Pca
33430 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
33440 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
33450 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[1] = sqlite3Pc
33460 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
33470 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
33480 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33    a[2] = sqlite3
33490 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69  PcacheGetCachesi
334a0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
334b0 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  he);.  a[3] = pP
334c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
334d0 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72  d ? (int) pPager
334e0 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20  ->dbSize : -1;. 
334f0 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
33500 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
33510 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
33520 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
33530 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
33540 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
33550 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
33560 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
33570 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
33580 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
33590 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
335a0 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
335b0 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64  return a;.}.#end
335c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
335d0 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
335e0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
335f0 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
33600 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28  te3PagerIsMemdb(
33610 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
33620 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a    return MEMDB;.
33630 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
33640 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74  hat there are at
33650 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e   least nSavepoin
33660 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65  t savepoints ope
33670 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  n. If there are.
33680 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73  ** currently les
33690 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e  s than nSavepoin
336a0 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70  ts open, then op
336b0 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  en one or more s
336c0 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  avepoints.** to 
336d0 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66  make up the diff
336e0 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e  erence. If the n
336f0 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
33700 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  nts is already.*
33710 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65  * equal to nSave
33720 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
33730 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
33740 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  o-op..**.** If a
33750 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
33760 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  on fails, SQLITE
33770 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
33780 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
33790 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
337a0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62   opening the sub
337b0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74  -journal file, t
337c0 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hen an IO error 
337d0 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
337e0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
337f0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
33800 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
33810 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  enSavepoint(Page
33820 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
33830 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
33840 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33860 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
33870 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
33880 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65  nCurrent = pPage
33890 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  r->nSavepoint;  
338a0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
338b0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
338c0 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20  oints */..  if( 
338d0 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72  nSavepoint>nCurr
338e0 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75  ent && pPager->u
338f0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
33900 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
33910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33920 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
33930 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
33940 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
33950 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20  int *aNew;      
33960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33970 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70  New Pager.aSavep
33980 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  oint array */.  
33990 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
339a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
339c0 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  e of database fi
339d0 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
339e0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
339f0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
33a00 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
33a10 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
33a20 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
33a30 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
33a40 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65 61   array using rea
33a50 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53  lloc(). Return S
33a60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20  QLITE_NOMEM.    
33a70 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61  ** if the alloca
33a80 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65  tion fails. Othe
33a90 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20  rwise, zero the 
33aa0 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63  new portion in c
33ab0 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61  ase a .    ** ma
33ac0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
33ad0 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61  urs while popula
33ae0 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66  ting it in the f
33af0 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c  or(...) loop bel
33b00 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ow..    */.    a
33b10 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76 65  New = (PagerSave
33b20 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52  point *)sqlite3R
33b30 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
33b40 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
33b50 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72  nt, sizeof(Pager
33b60 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65  Savepoint)*nSave
33b70 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20  point.    );.   
33b80 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20   if( !aNew ){.  
33b90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33ba0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
33bb0 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b     memset(&aNew[
33bc0 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e  nCurrent], 0, (n
33bd0 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65  Savepoint-nCurre
33be0 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67  nt) * sizeof(Pag
33bf0 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20  erSavepoint));. 
33c00 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
33c10 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 0a 20  point = aNew;.. 
33c20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
33c30 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
33c40 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73  t structures jus
33c50 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a  t allocated. */.
33c60 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72      for(ii=nCurr
33c70 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69  ent; ii<nSavepoi
33c80 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
33c90 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20   aNew[ii].nOrig 
33ca0 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 69  = nPage;.      i
33cb0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
33cc0 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
33cd0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29  ->journalOff>0 )
33ce0 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
33cf0 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61  i].iOffset = pPa
33d00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
33d10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33d20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
33d30 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c  Offset = JOURNAL
33d40 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
33d50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
33d60 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20  New[ii].iSubRec 
33d70 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  = pPager->nSubRe
33d80 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69  c;.      aNew[ii
33d90 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ].pInSavepoint =
33da0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
33db0 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 20  eate(nPage);.   
33dc0 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d     if( !aNew[ii]
33dd0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  .pInSavepoint ){
33de0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
33df0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
33e00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
33e10 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
33e20 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  er) ){.        s
33e30 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
33e40 6e 74 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  nt(pPager->pWal,
33e50 20 61 4e 65 77 5b 69 69 5d 2e 61 57 61 6c 44 61   aNew[ii].aWalDa
33e60 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
33e70 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
33e80 70 6f 69 6e 74 20 3d 20 69 69 2b 31 3b 0a 20 20  point = ii+1;.  
33e90 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
33ea0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
33eb0 6e 74 3d 3d 6e 53 61 76 65 70 6f 69 6e 74 20 29  nt==nSavepoint )
33ec0 3b 0a 20 20 20 20 61 73 73 65 72 74 54 72 75 6e  ;.    assertTrun
33ed0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
33ee0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
33ef0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33f00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33f10 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
33f20 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73  llback or releas
33f30 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76  e (commit) a sav
33f40 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73  epoint..** The s
33f50 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65  avepoint to rele
33f60 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
33f70 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20  need not be the 
33f80 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a  most recently .*
33f90 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  * created savepo
33fa0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  int..**.** Param
33fb0 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79  eter op is alway
33fc0 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  s either SAVEPOI
33fd0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53  NT_ROLLBACK or S
33fe0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
33ff0 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41  ..** If it is SA
34000 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
34010 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e   then release an
34020 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  d destroy the sa
34030 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20  vepoint with.** 
34040 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74  index iSavepoint
34050 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
34060 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
34070 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c  hen rollback all
34080 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74   changes.** that
34090 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73   have occurred s
340a0 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69  ince the specifi
340b0 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73  ed savepoint was
340c0 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
340d0 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
340e0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c   rollback or rel
340f0 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69  ease is identifi
34100 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
34110 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  .** iSavepoint. 
34120 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61  A value of 0 mea
34130 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ns to operate on
34140 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
34150 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65  avepoint.** (the
34160 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e   first created).
34170 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67   A value of (Pag
34180 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
34190 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a   means operate.*
341a0 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  * on the most re
341b0 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73  cently created s
341c0 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61  avepoint. If iSa
341d0 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
341e0 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65  er than.** (Page
341f0 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c  r.nSavepoint-1),
34200 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
34210 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
34220 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74  **.** If a negat
34230 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73  ive value is pas
34240 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
34250 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  tion, then the c
34260 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
34270 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
34280 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
34290 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69  fferent to calli
342a0 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
342b0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  gerRollback() be
342c0 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
342d0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72  ion does not ter
342e0 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72  minate.** the tr
342f0 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c  ansaction or unl
34300 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
34310 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72  , it just restor
34320 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  es the .** conte
34330 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
34340 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
34350 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  nal state. .**.*
34360 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61  * In any case, a
34370 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ll savepoints wi
34380 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  th an index grea
34390 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f  ter than iSavepo
343a0 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74  int .** are dest
343b0 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69  royed. If this i
343c0 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72  s a release oper
343d0 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50  ation (op==SAVEP
343e0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a  OINT_RELEASE),.*
343f0 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74  * then savepoint
34400 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61   iSavepoint is a
34410 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  lso destroyed..*
34420 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
34430 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
34440 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
34450 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
34460 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61  n fails,.** or a
34470 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
34480 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
34490 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c  ccurs while roll
344a0 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73  ing back a .** s
344b0 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20  avepoint. If no 
344c0 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51  errors occur, SQ
344d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
344e0 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ned..*/ .int sql
344f0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
34500 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
34510 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
34520 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
34530 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34540 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
34550 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
34560 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
34570 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
34580 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
34590 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41  int>=0 || op==SA
345a0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
345b0 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65   );..  if( iSave
345c0 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53  point<pPager->nS
345d0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
345e0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
345f0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
34600 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  ariable */.    i
34610 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
34620 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
34630 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69  emaining savepoi
34640 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f  nts after this o
34650 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p. */..    /* Fi
34660 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
34670 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c  y savepoints wil
34680 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76  l still be activ
34690 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20  e after this.   
346a0 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
346b0 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20  tore this value 
346c0 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72  in nNew. Then fr
346d0 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73  ee resources ass
346e0 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20  ociated .    ** 
346f0 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69  with any savepoi
34700 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73  nts that are des
34710 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f  troyed by this o
34720 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
34730 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76  .    nNew = iSav
34740 65 70 6f 69 6e 74 20 2b 20 28 28 20 6f 70 3d 3d  epoint + (( op==
34750 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
34760 45 20 29 20 3f 20 30 20 3a 20 31 29 3b 0a 20 20  E ) ? 0 : 1);.  
34770 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69    for(ii=nNew; i
34780 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
34790 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
347a0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
347b0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
347c0 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
347d0 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
347e0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
347f0 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65  nSavepoint = nNe
34800 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  w;..    /* If th
34810 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20  is is a release 
34820 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74  of the outermost
34830 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e   savepoint, trun
34840 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65  cate .    ** the
34850 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   sub-journal to 
34860 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
34870 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ze. */.    if( o
34880 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
34890 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 69 66  EASE ){.      if
348a0 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 69 73 4f  ( nNew==0 && isO
348b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
348c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
348d0 4f 6e 6c 79 20 74 72 75 6e 63 61 74 65 20 69 66  Only truncate if
348e0 20 69 74 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d   it is an in-mem
348f0 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  ory sub-journal.
34900 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
34910 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
34920 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
34930 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
34940 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
34950 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  ncate(pPager->sj
34960 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
34970 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
34980 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
34990 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
349a0 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
349b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
349c0 20 20 20 20 2f 2a 20 45 6c 73 65 20 74 68 69 73      /* Else this
349d0 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
349e0 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61  peration, playba
349f0 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ck the specified
34a00 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20   savepoint..    
34a10 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
34a20 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73  temp-file, it is
34a30 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74   possible that t
34a40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34a50 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79  has.    ** not y
34a60 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20  et been opened. 
34a70 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34a80 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
34a90 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a  changes to.    *
34aa0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
34ab0 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 79  ile, so the play
34ac0 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63  back operation c
34ad0 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
34ae0 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69     */.    else i
34af0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
34b00 50 61 67 65 72 29 20 7c 7c 20 69 73 4f 70 65 6e  Pager) || isOpen
34b10 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
34b20 0a 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65  .      PagerSave
34b30 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
34b40 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a  t = (nNew==0)?0:
34b50 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
34b60 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20  int[nNew-1];.   
34b70 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61     rc = pagerPla
34b80 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70  ybackSavepoint(p
34b90 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e  Pager, pSavepoin
34ba0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
34bb0 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc!=SQLITE_DONE
34bc0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 7d 0a  );.    }.  .  }.
34bd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34be0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
34bf0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
34c00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
34c10 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
34c20 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
34c30 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
34c40 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
34c50 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
34c60 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
34c70 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72  turn the VFS str
34c80 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70  ucture for the p
34c90 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  ager..*/.const s
34ca0 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69  qlite3_vfs *sqli
34cb0 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65  te3PagerVfs(Page
34cc0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
34cd0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66  turn pPager->pVf
34ce0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
34cf0 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  rn the file hand
34d00 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  le for the datab
34d10 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
34d20 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
34d30 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67  pager.  This mig
34d40 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ht return NULL i
34d50 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a  f the file has.*
34d60 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
34d70 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  pened..*/.sqlite
34d80 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50  3_file *sqlite3P
34d90 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a  agerFile(Pager *
34da0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
34db0 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a  n pPager->fd;.}.
34dc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
34dd0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
34de0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
34df0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
34e00 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
34e10 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  Journalname(Page
34e20 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
34e30 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
34e40 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
34e50 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
34e60 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
34e70 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
34e80 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
34e90 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
34ea0 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
34eb0 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
34ec0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
34ed0 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  rNosync(Pager *p
34ee0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
34ef0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
34f00 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
34f10 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
34f20 2a 20 53 65 74 20 6f 72 20 72 65 74 72 69 65 76  * Set or retriev
34f30 65 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  e the codec for 
34f40 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 73 74  this pager.*/.st
34f50 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
34f60 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
34f70 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
34f80 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
34f90 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
34fa0 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
34fb0 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
34fc0 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
34fd0 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  ),.  void (*xCod
34fe0 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 2c 0a  ecFree)(void*),.
34ff0 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 0a 29    void *pCodec.)
35000 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
35010 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
35020 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
35030 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
35040 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
35050 63 20 3d 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  c = pPager->memD
35060 62 20 3f 20 30 20 3a 20 78 43 6f 64 65 63 3b 0a  b ? 0 : xCodec;.
35070 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
35080 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64 65  SizeChng = xCode
35090 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50 61  cSizeChng;.  pPa
350a0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
350b0 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20 20  = xCodecFree;.  
350c0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20 3d  pPager->pCodec =
350d0 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65 72   pCodec;.  pager
350e0 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
350f0 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  r);.}.static voi
35100 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
35110 65 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a 70  etCodec(Pager *p
35120 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
35130 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b   pPager->pCodec;
35140 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
35150 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
35160 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
35170 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
35180 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
35190 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  no in the file..
351a0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
351b0 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
351c0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
351d0 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
351e0 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
351f0 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
35200 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
35210 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
35220 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
35230 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
35240 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
35250 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74  d at pgno is not
35260 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74   already.** in t
35270 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
35280 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  nal, it is not p
35290 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74  ut there by by t
352a0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
352b0 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
352c0 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65   the page pPg re
352d0 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
352e0 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
352f0 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
35300 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20   with pPg (i.e. 
35310 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
35320 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
35330 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
35340 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
35350 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
35360 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
35370 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
35380 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
35390 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
353a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
353b0 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
353c0 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
353d0 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
353e0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
353f0 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
35400 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
35410 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
35420 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
35430 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
35440 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
35450 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
35460 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
35470 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ive)..**.** If t
35480 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
35490 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73  nt, isCommit, is
354a0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
354b0 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65 69  this page is bei
354c0 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70  ng.** moved as p
354d0 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  art of a databas
354e0 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e  e reorganization
354f0 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
35500 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
35510 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
35520 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
35530 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  e, it is guarant
35540 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61 74  eed that the dat
35550 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20 70  abase page .** p
35560 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69 6c  Pg refers to wil
35570 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
35580 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69 6e   to again within
35590 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
355a0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  n..**.** This fu
355b0 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
355c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  n SQLITE_NOMEM o
355d0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
355e0 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
355f0 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72 77  * occurs. Otherw
35600 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ise, it returns 
35610 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
35620 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  t sqlite3PagerMo
35630 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
35640 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50  ager, DbPage *pP
35650 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e  g, Pgno pgno, in
35660 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  t isCommit){.  P
35670 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20  gHdr *pPgOld;   
35680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
35690 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
356a0 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
356b0 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
356c0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  o = 0;       /* 
356d0 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50 67  Old value of pPg
356e0 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20  ->pgno, if sync 
356f0 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  is required */. 
35700 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
35710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35720 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
35730 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b    Pgno origPgno;
35740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35750 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  * The original p
35760 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  age number */.. 
35770 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
35780 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  ef>0 );..  /* In
35790 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61 62 6c   order to be abl
357a0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  e to rollback, a
357b0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
357c0 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72 6e 61  base must journa
357d0 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  l.  ** the page 
357e0 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 20 66 72  we are moving fr
357f0 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  om..  */.  if( M
35800 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20 3d  EMDB ){.    rc =
35810 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
35820 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  te(pPg);.    if(
35830 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
35840 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
35850 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76  e page being mov
35860 65 64 20 69 73 20 64 69 72 74 79 20 61 6e 64 20  ed is dirty and 
35870 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76  has not been sav
35880 65 64 20 62 79 20 74 68 65 20 6c 61 74 65 73 74  ed by the latest
35890 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c  .  ** savepoint,
358a0 20 74 68 65 6e 20 73 61 76 65 20 74 68 65 20 63   then save the c
358b0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
358c0 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  of the page into
358d0 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a   the .  ** sub-j
358e0 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73  ournal now. This
358f0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
35900 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f  handle the follo
35910 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20  wing scenario:. 
35920 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e   **.  **   BEGIN
35930 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72  ;.  **     <jour
35940 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e  nal page X, then
35950 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65   modify it in me
35960 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53  mory>.  **     S
35970 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
35980 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70  **       <Move p
35990 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f  age X to locatio
359a0 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f  n Y>.  **     RO
359b0 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20  LLBACK TO one;. 
359c0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65   **.  ** If page
359d0 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74   X were not writ
359e0 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
359f0 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20  ournal here, it 
35a00 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62  would not.  ** b
35a10 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65  e possible to re
35a20 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e  store its conten
35a30 74 73 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ts when the "ROL
35a40 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20  LBACK TO one".  
35a50 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72  ** statement wer
35a60 65 20 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a  e is processed..
35a70 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75    **.  ** subjou
35a80 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e  rnalPage() may n
35a90 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  eed to allocate 
35aa0 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70  space to store p
35ab0 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20  Pg->pgno into.  
35ac0 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ** one or more s
35ad0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
35ae0 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 72 65  . This is the re
35af0 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ason this functi
35b00 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  on.  ** may retu
35b10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
35b20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
35b30 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
35b40 54 59 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71  TY.   && subjReq
35b50 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
35b60 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
35b70 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c  (rc = subjournal
35b80 50 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a  Page(pPg)).  ){.
35b90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35ba0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
35bb0 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  (("MOVE %d page 
35bc0 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
35bd0 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
35be0 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
35bf0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
35c00 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  no, (pPg->flags&
35c10 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
35c20 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ?1:0, pgno));.  
35c30 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
35c40 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
35c50 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
35c60 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74  gno))..  /* If t
35c70 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
35c80 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
35c90 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d  before page pPg-
35ca0 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62  >pgno can.  ** b
35cb0 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74  e written to, st
35cc0 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
35cd0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20   local variable 
35ce0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
35cf0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69  **.  ** If the i
35d00 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  sCommit flag is 
35d10 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  set, there is no
35d20 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
35d30 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  r that.  ** the 
35d40 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
35d50 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
35d60 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
35d70 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a  e pPg->pgno .  *
35d80 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
35d90 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
35da0 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
35db0 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
35dc0 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
35dd0 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
35de0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
35df0 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b   && !isCommit ){
35e00 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
35e10 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
35e20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49     assert( pageI
35e30 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c  nJournal(pPg) ||
35e40 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
35e50 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
35e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
35e70 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
35e80 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  RTY );.    asser
35e90 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
35ea0 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
35eb0 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
35ec0 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
35ed0 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
35ee0 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
35ef0 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
35f00 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
35f10 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
35f20 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
35f30 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
35f40 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
35f50 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
35f60 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
35f70 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
35f80 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
35f90 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
35fa0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
35fb0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70  R_NEED_SYNC;.  p
35fc0 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
35fd0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
35fe0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  o);.  assert( !p
35ff0 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d  PgOld || pPgOld-
36000 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66  >nRef==1 );.  if
36010 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
36020 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70  pPg->flags |= (p
36030 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48  PgOld->flags&PGH
36040 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20  DR_NEED_SYNC);. 
36050 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
36060 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
36070 64 69 73 63 61 72 64 20 70 61 67 65 73 20 66 72  discard pages fr
36080 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  om an in-memory 
36090 64 61 74 61 62 61 73 65 20 73 69 6e 63 65 20 77  database since w
360a0 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a  e might.      **
360b0 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
360c0 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73 74 20 6d  k later.  Just m
360d0 6f 76 65 20 74 68 65 20 70 61 67 65 20 6f 75 74  ove the page out
360e0 20 6f 66 20 74 68 65 20 77 61 79 2e 20 2a 2f 0a   of the way. */.
360f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
36100 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
36110 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d );.      sqlit
36120 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
36130 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  Old, pPager->dbS
36140 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ize+1);.    }els
36150 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
36160 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c  PcacheDrop(pPgOl
36170 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
36180 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d   origPgno = pPg-
36190 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  >pgno;.  sqlite3
361a0 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20  PcacheMove(pPg, 
361b0 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  pgno);.  sqlite3
361c0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
361d0 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
361e0 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
361f0 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
36200 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
36210 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
36220 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
36230 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36240 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
36250 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
36260 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
36270 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
36280 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
36290 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
362a0 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
362b0 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
362c0 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
362d0 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
362e0 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c    ** "is journal
362f0 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20  ed" bitvec flag 
36300 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
36310 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
36320 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a  emedied by.    *
36330 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61  * loading the pa
36340 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
36350 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
36360 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
36370 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66  edSync .    ** f
36380 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
36390 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70  ** If the attemp
363a0 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61  t to load the pa
363b0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
363c0 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64  -cache fails, (d
363d0 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d  ue.    ** to a m
363e0 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
363f0 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68  ilure), clear th
36400 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e  e bit in the pIn
36410 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a  Journal[].    **
36420 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
36430 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  e, if the page i
36440 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69  s loaded and wri
36450 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20  tten again in.  
36460 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
36470 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65  ction, it may be
36480 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
36490 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
364a0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  fore.    ** it i
364b0 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  s synced into th
364c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
364d0 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79  This way, it may
364e0 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a   end up in.    *
364f0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
36500 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68  le twice, but th
36510 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  at is not a prob
36520 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lem..    **.    
36530 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
36540 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
36550 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
36560 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
36570 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
36580 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
36590 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
365a0 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
365b0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
365c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
365d0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
365e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
365f0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
36600 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
36610 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
36620 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36630 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53  .      if( needS
36640 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  yncPgno<=pPager-
36650 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
36660 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
36670 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
36680 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
36690 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61  qlite3BitvecClea
366a0 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  r(pPager->pInJou
366b0 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67  rnal, needSyncPg
366c0 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  no, pPager->pTmp
366d0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Space);.      }.
366e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
366f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
36700 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
36710 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36720 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
36730 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  & !MEMDB );.    
36740 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d  pPgHdr->flags |=
36750 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
36760 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
36770 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
36780 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hdr);.    sqlite
36790 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
367a0 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dr);.  }..  /*. 
367b0 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65   ** For an in-me
367c0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6d  mory database, m
367d0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 69  ake sure the ori
367e0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 69  ginal page conti
367f0 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69  nues.  ** to exi
36800 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  st, in case the 
36810 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
36820 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  s to roll back. 
36830 20 55 73 65 20 70 50 67 4f 6c 64 0a 20 20 2a 2a   Use pPgOld.  **
36840 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
36850 20 70 61 67 65 20 73 69 6e 63 65 20 69 74 20 68   page since it h
36860 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
36870 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a 2f 0a  allocated..  */.
36880 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
36890 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
368a0 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f 72 69  Move(pPgOld, ori
368b0 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69  gPgno);.    sqli
368c0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
368d0 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  gOld);.  }..  re
368e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
368f0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
36900 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
36910 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72   to the data for
36920 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
36930 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
36940 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
36950 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
36960 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
36970 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50  Ref>0 || pPg->pP
36980 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20  ager->memDb );. 
36990 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61   return pPg->pDa
369a0 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ta;.}../*.** Ret
369b0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
369c0 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
369d0 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
369e0 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
369f0 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
36a00 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
36a10 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
36a20 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
36a30 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
36a40 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
36a50 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExtra;.}../*.**
36a60 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
36a70 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
36a80 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
36a90 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
36aa0 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
36ab0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
36ac0 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
36ad0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
36ae0 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
36af0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
36b00 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
36b10 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
36b20 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
36b30 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
36b40 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
36b50 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
36b60 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
36b70 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
36b80 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
36b90 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
36ba0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
36bb0 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
36bc0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
36bd0 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
36be0 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
36bf0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
36c00 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
36c10 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
36c20 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
36c30 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
36c40 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
36c50 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
36c60 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
36c70 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
36c80 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
36c90 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
36ca0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
36cb0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
36cc0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
36cd0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
36ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
36cf0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
36d00 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
36d10 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
36d20 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
36d30 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
36d40 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
36d50 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
36d60 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
36d70 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  (u8)eMode;.  }. 
36d80 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
36d90 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
36da0 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
36db0 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  /set the journal
36dc0 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
36dd0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
36de0 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
36df0 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50  e of:.**.**    P
36e00 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
36e10 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47  _QUERY.**    PAG
36e20 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
36e30 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  ELETE.**    PAGE
36e40 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
36e50 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47  UNCATE.**    PAG
36e60 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
36e70 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47  ERSIST.**    PAG
36e80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
36e90 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  FF.**    PAGER_J
36ea0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
36eb0 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  Y.**    PAGER_JO
36ec0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 2a 2a  URNALMODE_WAL.**
36ed0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d  .** If the param
36ee0 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
36ef0 52 59 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  RY, then the jou
36f00 72 6e 61 6c 5f 6d 6f 64 65 20 69 73 20 73 65 74  rnal_mode is set
36f10 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   to the.** value
36f20 20 73 70 65 63 69 66 69 65 64 20 69 66 20 74 68   specified if th
36f30 65 20 63 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f  e change is allo
36f40 77 65 64 2e 20 54 68 65 20 63 68 61 6e 67 65 20  wed. The change 
36f50 6d 61 79 20 62 65 20 64 69 73 61 6c 6c 6f 77 65  may be disallowe
36f60 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 6f 6c  d.** for the fol
36f70 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a  lowing reasons:.
36f80 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e  **.**   *  An in
36f90 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
36fa0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69   can only have i
36fb0 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  ts journal_mode 
36fc0 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20  set to _OFF.**  
36fd0 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a      or _MEMORY..
36fe0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6a  **.**   *  The j
36ff0 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61 79 20  ournal mode may 
37000 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 77  not be changed w
37010 68 69 6c 65 20 61 20 74 72 61 6e 73 61 63 74 69  hile a transacti
37020 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
37030 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
37040 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75   indicate the cu
37050 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
37060 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c  updated) journal
37070 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
37080 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
37090 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  lMode(Pager *pPa
370a0 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
370b0 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
370c0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
370d0 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
370e0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
370f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37100 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
37110 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
37120 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37130 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20  _TRUNCATE.      
37140 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
37150 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37160 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
37170 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
37180 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37190 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
371a0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
371b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
371c0 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL .            
371d0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
371e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
371f0 52 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RY );.  assert( 
37200 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37210 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 0a 20 20  E_QUERY<0 );..  
37220 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  if( eMode==PAGER
37230 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
37240 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e   .   && pPager->
37250 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
37260 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
37270 45 4c 45 54 45 0a 20 20 29 7b 0a 20 20 20 20 70  ELETE.  ){.    p
37280 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
37290 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
372a0 41 4c 4d 4f 44 45 5f 57 41 4c 3b 0a 20 20 7d 65  ALMODE_WAL;.  }e
372b0 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  lse if( eMode>=0
372c0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
372d0 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 65  tempFile==0 || e
372e0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
372f0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
37300 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20 65 4d  && (!MEMDB || eM
37310 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
37320 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 7c 7c 65  ALMODE_MEMORY||e
37330 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
37340 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20  NALMODE_OFF).   
37350 26 26 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f  && !pPager->dbMo
37360 64 69 66 69 65 64 0a 20 20 20 26 26 20 28 21 69  dified.   && (!i
37370 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
37380 64 29 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d  d) || 0==pPager-
37390 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a 20 20 29  >journalOff).  )
373a0 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  {.    if( isOpen
373b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
373c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
373d0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
373e0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  d);.    }.    as
373f0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
37400 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
37410 45 20 26 20 31 29 3d 3d 31 20 29 3b 0a 20 20 20  E & 1)==1 );.   
37420 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
37430 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
37440 49 53 54 20 26 20 31 29 3d 3d 31 20 29 3b 0a 20  IST & 1)==1 );. 
37450 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
37460 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
37470 4c 45 54 45 20 26 20 31 29 3d 3d 30 20 29 3b 0a  LETE & 1)==0 );.
37480 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
37490 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
374a0 45 4d 4f 52 59 20 26 20 31 29 3d 3d 30 20 29 3b  EMORY & 1)==0 );
374b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
374c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
374d0 4f 46 46 20 26 20 31 29 3d 3d 30 20 29 3b 0a 20  OFF & 1)==0 );. 
374e0 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e     if( (pPager->
374f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 31 29  journalMode & 1)
37500 3d 3d 31 20 26 26 20 28 65 4d 6f 64 65 20 26 20  ==1 && (eMode & 
37510 31 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  1)==0.         &
37520 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  & !pPager->exclu
37530 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
37540 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
37550 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
37560 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
37570 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
37580 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37590 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
375a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
375b0 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72  int)pPager->jour
375c0 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalMode;.}../*.*
375d0 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69  * Get/set the si
375e0 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f  ze-limit used fo
375f0 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
37600 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
37610 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20 73 69  * Setting the si
37620 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d  ze limit to -1 m
37630 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73  eans no limit is
37640 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e   enforced..** An
37650 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   attempt to set 
37660 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20  a limit smaller 
37670 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d  than -1 is a no-
37680 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  op..*/.i64 sqlit
37690 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
376a0 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  zeLimit(Pager *p
376b0 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69  Pager, i64 iLimi
376c0 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  t){.  if( iLimit
376d0 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67  >=-1 ){.    pPag
376e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
376f0 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20  imit = iLimit;. 
37700 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
37710 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
37720 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  imit;.}../*.** R
37730 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
37740 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  to the pPager->p
37750 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65 2e  Backup variable.
37760 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64 75   The backup modu
37770 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e  le.** in backup.
37780 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20  c maintains the 
37790 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
377a0 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 6d  variable. This m
377b0 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74  odule.** uses it
377c0 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e 20   opaquely as an 
377d0 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
377e0 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
377f0 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
37800 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 29 20  3BackupUpdate() 
37810 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  only..*/.sqlite3
37820 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65  _backup **sqlite
37830 33 50 61 67 65 72 42 61 63 6b 75 70 50 74 72 28  3PagerBackupPtr(
37840 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
37850 20 20 72 65 74 75 72 6e 20 26 70 50 61 67 65 72    return &pPager
37860 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 69  ->pBackup;.}..#i
37870 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37880 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_WAL./*.** This
37890 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
378a0 6c 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  led when the use
378b0 72 20 69 6e 76 6f 6b 65 73 20 22 50 52 41 47 4d  r invokes "PRAGM
378c0 41 20 63 68 65 63 6b 70 6f 69 6e 74 22 2e 0a 2a  A checkpoint"..*
378d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
378e0 65 72 43 68 65 63 6b 70 6f 69 6e 74 28 50 61 67  erCheckpoint(Pag
378f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
37900 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37910 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
37920 3e 70 57 61 6c 20 29 7b 0a 20 20 20 20 75 38 20  >pWal ){.    u8 
37930 2a 7a 42 75 66 20 3d 20 28 75 38 20 2a 29 70 50  *zBuf = (u8 *)pP
37940 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
37950 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
37960 33 57 61 6c 43 68 65 63 6b 70 6f 69 6e 74 28 70  3WalCheckpoint(p
37970 50 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20  Pager->pWal,.   
37980 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f       (pPager->no
37990 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61 67 65  Sync ? 0 : pPage
379a0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c 0a  r->sync_flags),.
379b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
379c0 70 61 67 65 53 69 7a 65 2c 20 7a 42 75 66 0a 20  pageSize, zBuf. 
379d0 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75     );.  }.  retu
379e0 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71  rn rc;.}..int sq
379f0 6c 69 74 65 33 50 61 67 65 72 57 61 6c 43 61 6c  lite3PagerWalCal
37a00 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
37a10 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ger){.  return s
37a20 71 6c 69 74 65 33 57 61 6c 43 61 6c 6c 62 61 63  qlite3WalCallbac
37a30 6b 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  k(pPager->pWal);
37a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
37a50 20 74 72 75 65 20 69 66 20 74 68 65 20 75 6e 64   true if the und
37a60 65 72 6c 79 69 6e 67 20 56 46 53 20 66 6f 72 20  erlying VFS for 
37a70 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
37a80 73 75 70 70 6f 72 74 73 20 74 68 65 0a 2a 2a 20  supports the.** 
37a90 70 72 69 6d 69 74 69 76 65 73 20 6e 65 63 65 73  primitives neces
37aa0 73 61 72 79 20 66 6f 72 20 77 72 69 74 65 2d 61  sary for write-a
37ab0 68 65 61 64 20 6c 6f 67 67 69 6e 67 2e 0a 2a 2f  head logging..*/
37ac0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
37ad0 72 57 61 6c 53 75 70 70 6f 72 74 65 64 28 50 61  rWalSupported(Pa
37ae0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
37af0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
37b00 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f  _methods *pMetho
37b10 64 73 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 2d  ds = pPager->fd-
37b20 3e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 72 65 74  >pMethods;.  ret
37b30 75 72 6e 20 70 4d 65 74 68 6f 64 73 2d 3e 69 56  urn pMethods->iV
37b40 65 72 73 69 6f 6e 3e 3d 32 20 26 26 20 70 4d 65  ersion>=2 && pMe
37b50 74 68 6f 64 73 2d 3e 78 53 68 6d 4f 70 65 6e 21  thods->xShmOpen!
37b60 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  =0;.}../*.** Ope
37b70 6e 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  n a connection t
37b80 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  o the write-ahea
37b90 64 20 6c 6f 67 20 66 69 6c 65 20 66 6f 72 20 70  d log file for p
37ba0 61 67 65 72 20 70 50 61 67 65 72 2e 20 49 66 0a  ager pPager. If.
37bb0 2a 2a 20 74 68 65 20 6c 6f 67 20 63 6f 6e 6e 65  ** the log conne
37bc0 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
37bd0 20 6f 70 65 6e 2c 20 74 68 69 73 20 66 75 6e 63   open, this func
37be0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
37bf0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
37c00 72 20 6d 75 73 74 20 62 65 20 68 6f 6c 64 69 6e  r must be holdin
37c10 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
37c20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
37c30 66 69 6c 65 20 74 6f 20 63 61 6c 6c 0a 2a 2a 20  file to call.** 
37c40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
37c50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
37c60 65 72 4f 70 65 6e 57 61 6c 28 50 61 67 65 72 20  erOpenWal(Pager 
37c70 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 69  *pPager, int *pi
37c80 73 4f 70 65 6e 29 7b 0a 20 20 69 6e 74 20 72 63  sOpen){.  int rc
37c90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
37ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
37cb0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
37cc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
37cd0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
37ce0 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ED );.  if( !pPa
37cf0 67 65 72 2d 3e 70 57 61 6c 20 29 7b 0a 20 20 20  ger->pWal ){.   
37d00 20 69 66 28 20 21 73 71 6c 69 74 65 33 50 61 67   if( !sqlite3Pag
37d10 65 72 57 61 6c 53 75 70 70 6f 72 74 65 64 28 70  erWalSupported(p
37d20 50 61 67 65 72 29 20 29 20 72 65 74 75 72 6e 20  Pager) ) return 
37d30 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
37d40 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
37d50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
37d60 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66  the log file. If
37d70 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
37d80 66 61 69 6c 73 2c 20 0a 20 20 20 20 2a 2a 20 28  fails, .    ** (
37d90 65 2e 67 2e 20 64 75 65 20 74 6f 20 6d 61 6c 6c  e.g. due to mall
37da0 6f 63 28 29 20 66 61 69 6c 75 72 65 29 2c 20 75  oc() failure), u
37db0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
37dc0 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 20 20 20  se file and .   
37dd0 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 65 72   ** return an er
37de0 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
37df0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
37e00 33 57 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  3WalOpen(pPager-
37e10 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 66  >pVfs, pPager->f
37e20 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
37e30 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
37e40 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 70  r->zFilename, &p
37e50 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
37e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
37e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
37e90 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
37ea0 4d 4f 44 45 5f 57 41 4c 3b 0a 20 20 20 20 7d 0a  MODE_WAL;.    }.
37eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69    }else{.    *pi
37ec0 73 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a  sOpen = 1;.  }..
37ed0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37ee0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
37ef0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
37f00 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65   close the conne
37f10 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 6f 67  ction to the log
37f20 20 66 69 6c 65 20 70 72 69 6f 72 0a 2a 2a 20 74   file prior.** t
37f30 6f 20 73 77 69 74 63 68 69 6e 67 20 66 72 6f 6d  o switching from
37f40 20 57 41 4c 20 74 6f 20 72 6f 6c 6c 62 61 63 6b   WAL to rollback
37f50 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66   mode..**.** Bef
37f60 6f 72 65 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  ore closing the 
37f70 6c 6f 67 20 66 69 6c 65 2c 20 74 68 69 73 20 66  log file, this f
37f80 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
37f90 20 74 6f 20 74 61 6b 65 20 61 6e 20 0a 2a 2a 20   to take an .** 
37fa0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
37fb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
37fc0 69 6c 65 2e 20 49 66 20 74 68 69 73 20 63 61 6e  ile. If this can
37fd0 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
37fe0 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 28 53 51   an.** error (SQ
37ff0 4c 49 54 45 5f 42 55 53 59 29 20 69 73 20 72 65  LITE_BUSY) is re
38000 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6c  turned and the l
38010 6f 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  og connection is
38020 20 6e 6f 74 20 63 6c 6f 73 65 64 2e 0a 2a 2a 20   not closed..** 
38030 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
38040 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
38050 6b 20 69 73 20 6e 6f 74 20 72 65 6c 65 61 73 65  k is not release
38060 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
38070 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
38080 65 33 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28  e3PagerCloseWal(
38090 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
380a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
380b0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
380c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
380d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
380e0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 3b 0a 0a  NALMODE_WAL );..
380f0 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 67 20    /* If the log 
38100 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  file is not alre
38110 61 64 79 20 6f 70 65 6e 2c 20 62 75 74 20 64 6f  ady open, but do
38120 65 73 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  es exist in the 
38130 66 69 6c 65 2d 73 79 73 74 65 6d 2c 0a 20 20 2a  file-system,.  *
38140 2a 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f  * it may need to
38150 20 62 65 20 63 68 65 63 6b 70 6f 69 6e 74 65 64   be checkpointed
38160 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e   before the conn
38170 65 63 74 69 6f 6e 20 63 61 6e 20 73 77 69 74 63  ection can switc
38180 68 20 74 6f 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  h to.  ** rollba
38190 63 6b 20 6d 6f 64 65 2e 20 4f 70 65 6e 20 69 74  ck mode. Open it
381a0 20 6e 6f 77 20 73 6f 20 74 68 69 73 20 63 61 6e   now so this can
381b0 20 68 61 70 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20   happen..  */.  
381c0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 57 61  if( !pPager->pWa
381d0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 67  l ){.    int log
381e0 65 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20  exists = 0;.    
381f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
38200 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
38210 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45  QLITE_LOCK_SHARE
38220 44 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  D);.    if( rc==
38230 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
38240 20 20 20 72 63 20 3d 20 70 61 67 65 72 48 61 73     rc = pagerHas
38250 57 41 4c 28 70 50 61 67 65 72 2c 20 26 6c 6f 67  WAL(pPager, &log
38260 65 78 69 73 74 73 29 3b 0a 20 20 20 20 7d 0a 20  exists);.    }. 
38270 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38280 45 5f 4f 4b 20 26 26 20 6c 6f 67 65 78 69 73 74  E_OK && logexist
38290 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  s ){.      rc = 
382a0 73 71 6c 69 74 65 33 57 61 6c 4f 70 65 6e 28 70  sqlite3WalOpen(p
382b0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
382c0 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20  ger->fd,.       
382d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382e0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
382f0 6e 61 6d 65 2c 20 26 70 50 61 67 65 72 2d 3e 70  name, &pPager->p
38300 57 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Wal);.    }.  }.
38310 20 20 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 70      .  /* Checkp
38320 6f 69 6e 74 20 61 6e 64 20 63 6c 6f 73 65 20 74  oint and close t
38330 68 65 20 6c 6f 67 2e 20 42 65 63 61 75 73 65 20  he log. Because 
38340 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
38350 6b 20 69 73 20 68 65 6c 64 20 6f 6e 0a 20 20 2a  k is held on.  *
38360 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
38370 69 6c 65 2c 20 74 68 65 20 6c 6f 67 20 61 6e 64  ile, the log and
38380 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 66 69 6c   log-summary fil
38390 65 73 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  es will be delet
383a0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ed..  */.  if( r
383b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
383c0 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 7b 0a  pPager->pWal ){.
383d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
383e0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
383f0 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  d, SQLITE_LOCK_E
38400 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 20 20 69  XCLUSIVE);.    i
38410 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
38420 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
38430 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
38440 50 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20  Pager->pWal,.   
38450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38460 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
38470 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70 50  >noSync ? 0 : pP
38480 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
38490 29 2c 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  ), .        pPag
384a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
384b0 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  8*)pPager->pTmpS
384c0 70 61 63 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  pace.      );.  
384d0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c      pPager->pWal
384e0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
384f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20  .      /* If we 
38500 63 61 6e 6e 6f 74 20 67 65 74 20 61 6e 20 45 58  cannot get an EX
38510 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 64 6f  CLUSIVE lock, do
38520 77 6e 67 72 61 64 65 20 74 68 65 20 50 45 4e 44  wngrade the PEND
38530 49 4e 47 20 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  ING lock.      *
38540 2a 20 74 68 61 74 20 77 65 20 64 69 64 20 67 65  * that we did ge
38550 74 20 62 61 63 6b 20 74 6f 20 53 48 41 52 45 44  t back to SHARED
38560 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
38570 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
38580 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 4c 4f  r->fd, SQLITE_LO
38590 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 20 20  CK_SHARED);.    
385a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
385b0 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e  c;.}.#endif..#en
385c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
385d0 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a           IT_DISKIO */.