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

Artifact d6454d37992882904ac0cdc1fd12887d1eecf434:


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: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2660: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
2670: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
2680: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
2690: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
26a0: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
26b0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
26c0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
26d0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
26e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
26f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
2700: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
2710: 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f 64  *   Pager.errCod
2720: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
2730: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
2740: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
2750: 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45 5f  .**   or SQLITE_
2760: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
2770: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
2780: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
2790: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
27a0: 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65    and is returne
27b0: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
27c0: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
27d0: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
27e0: 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  The.**   SQLITE_
27f0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
2800: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
2810: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
2820: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
2830: 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75 63  he.**   next suc
2840: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
2850: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
2860: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2870: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51 4c  . Also,.**   SQL
2880: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
2890: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
28a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
28b0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
28c0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50 49  ookup().**   API
28d0: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
28e0: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
28f0: 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64 62  sfully..**.** db
2900: 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69 7a  SizeValid, dbSiz
2910: 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20 64  e, dbOrigSize, d
2920: 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bFileSize.**.** 
2930: 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20 73    Managing the s
2940: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2950: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
2960: 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63 6f  s is a little co
2970: 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20 20  mplicated..**   
2980: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
2990: 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61 69  er.dbSize contai
29a0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29b0: 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20   pages that the 
29c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69 6d  database.**   im
29d0: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  age currently co
29e0: 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64  ntains. As the d
29f0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67 72  atabase image gr
2a00: 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74  ows or shrinks t
2a10: 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c  his.**   variabl
2a20: 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54 68  e is updated. Th
2a30: 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65 72  e variable Pager
2a40: 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74  .dbFileSize cont
2a50: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  ains the number.
2a60: 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69 6e  **   of pages in
2a70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a80: 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20  le. This may be 
2a90: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 50  different from P
2aa0: 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20 20  ager.dbSize.**  
2ab0: 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20 68   if some pages h
2ac0: 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ave been appende
2ad0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
2ae0: 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74 20  e image but not 
2af0: 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  yet written.**  
2b00: 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63 61   out from the ca
2b10: 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75 61  che to the actua
2b20: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  l file on disk. 
2b30: 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65 20  Or if the image 
2b40: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74 72  has been.**   tr
2b50: 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69 6e  uncated by an in
2b60: 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
2b70: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20   operation. The 
2b80: 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a 65  Pager.dbOrigSize
2b90: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 63   variable.**   c
2ba0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
2bb0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2bc0: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2bd0: 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
2be0: 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63 74  nt.**   transact
2bf0: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
2c00: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2c10: 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  all three of the
2c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73 0a  se variables is.
2c30: 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61 6e  **   only guaran
2c40: 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65  teed to be corre
2c50: 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61  ct if the boolea
2c60: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61  n Pager.dbSizeVa
2c70: 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lid is true..**.
2c80: 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65 72  **   TODO: Under
2c90: 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e 73   what conditions
2ca0: 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64 20   is dbSizeValid 
2cb0: 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a 2a  set? Cleared?.**
2cc0: 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  .** changeCountD
2cd0: 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  one.**.**   This
2ce0: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
2cf0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  e is used to mak
2d00: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
2d10: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
2d20: 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74 65  **   (the 4-byte
2d30: 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61 74   header field at
2d40: 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2d50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d60: 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20 6e  file) is .**   n
2d70: 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65 20  ot updated more 
2d80: 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65 73  often than neces
2d90: 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  sary. .**.**   I
2da0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
2db0: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   when the change
2dc0: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 69  -counter field i
2dd0: 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63 68  s updated, which
2de0: 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79 20   .**   can only 
2df0: 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78 63  happen if an exc
2e00: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
2e10: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2e20: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
2e30: 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73 65  t is cleared (se
2e40: 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65 6e  t to false) when
2e50: 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69 76  ever an exclusiv
2e60: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20 20  e lock is .**   
2e70: 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e 20  relinquished on 
2e80: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e90: 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 74  e. Each time a t
2ea0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2eb0: 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54 68  mmitted,.**   Th
2ec0: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
2ed0: 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65 63  e flag is inspec
2ee0: 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74 72  ted. If it is tr
2ef0: 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66 0a  ue, the work of.
2f00: 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74 68  **   updating th
2f10: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2f20: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20   is omitted for 
2f30: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2f40: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
2f50: 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20   This mechanism 
2f60: 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e 20  means that when 
2f70: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2f80: 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f 6e  sive mode, a con
2f90: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e 65  nection .**   ne
2fa0: 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20 74  ed only update t
2fb0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2fc0: 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65 20  r once, for the 
2fd0: 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69 6f  first transactio
2fe0: 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65 64  n.**   committed
2ff0: 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66 69  ..**.** dbModifi
3000: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ed.**.**   The d
3010: 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20 69  bModified flag i
3020: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 61  s set whenever a
3030: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
3040: 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20 20  s dirtied..**   
3050: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61 74  It is cleared at
3060: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
3070: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
3080: 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65 64  .**   It is used
3090: 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
30a0: 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65 6e   or otherwise en
30b0: 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ding a transacti
30c0: 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65 20  on. If.**   the 
30d0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
30e0: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c 65  is clear then le
30f0: 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20 62  ss work has to b
3100: 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f  e done..**.** jo
3110: 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a 0a  urnalStarted.**.
3120: 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20 69  **   This flag i
3130: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 74  s set whenever t
3140: 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  he the main jour
3150: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  nal is opened an
3160: 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69 7a  d.**   initializ
3170: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  ed.**.**   The p
3180: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
3190: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
31a0: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
31b0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
31c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
31d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
31e0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
31f0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
3200: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
3210: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
3220: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
3230: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
3240: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
3250: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
3260: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
3270: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
3280: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
3290: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
32a0: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
32b0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
32c0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
32d0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
32e0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
32f0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
3300: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
3310: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
3320: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
3330: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
3340: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
3350: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
3360: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
3370: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
3380: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
3390: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
33a0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
33b0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
33c0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
33d0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
33e0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
33f0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
3400: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
3410: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
3420: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
3430: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
3440: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
3450: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
3460: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
3470: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
3480: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
3490: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
34a0: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
34b0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
34c0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
34d0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
34e0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
34f0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
3500: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
3510: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
3520: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
3530: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
3540: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
3550: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
3560: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
3570: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
3580: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
3590: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
35a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
35b0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
35c0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
35d0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
35e0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c 20  .** doNotSpill, 
35f0: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a 2a  doNotSyncSpill.*
3600: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
3610: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
3620: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3630: 2e 20 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  .  The doNotSpil
3640: 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  l variable.**   
3650: 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
3660: 68 65 20 73 70 69 6c 6c 20 61 6e 64 20 64 6f 4e  he spill and doN
3670: 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 6e 68 69  otSyncSpill inhi
3680: 62 69 74 73 20 74 68 6f 73 65 20 73 70 69 6c 6c  bits those spill
3690: 73 20 74 68 61 74 0a 2a 2a 20 20 20 77 6f 75 6c  s that.**   woul
36a0: 64 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  d require a jour
36b0: 6e 61 6c 20 73 79 6e 63 2e 20 20 54 68 65 20 64  nal sync.  The d
36c0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73  oNotSyncSpill is
36d0: 20 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64   set and cleared
36e0: 20 0a 2a 2a 20 20 20 62 79 20 73 71 6c 69 74 65   .**   by sqlite
36f0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 6e  3PagerWrite() in
3700: 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e   order to preven
3710: 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  t a journal sync
3720: 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20   from happening 
3730: 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65 6e  .**   in between
3740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
3750: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
3760: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
3770: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 64 6f 4e 6f  .  The.**   doNo
3780: 74 53 70 69 6c 6c 20 76 61 6c 75 65 20 73 65 74  tSpill value set
3790: 20 74 6f 20 70 72 65 76 65 6e 74 20 70 61 67 65   to prevent page
37a0: 72 53 74 72 65 73 73 28 29 20 66 72 6f 6d 20 74  rStress() from t
37b0: 72 79 69 6e 67 20 74 6f 20 75 73 65 0a 2a 2a 20  rying to use.** 
37c0: 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 75    the journal du
37d0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
37e0: 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a  .**.** needSync.
37f0: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74  **.**   TODO: It
3800: 20 6d 69 67 68 74 20 62 65 20 65 61 73 69 65 72   might be easier
3810: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
3820: 69 61 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f  iable in writeJo
3830: 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20  urnalHdr().**   
3840: 61 6e 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a  and writeMasterJ
3850: 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43  ournal() only. C
3860: 68 61 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e  hange its meanin
3870: 67 20 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64  g to "unsynced d
3880: 61 74 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65  ata.**   has bee
3890: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
38a0: 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a   journal"..**.**
38b0: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
38c0: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
38d0: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
38e0: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
38f0: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
3900: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
3910: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
3920: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
3930: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
3940: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
3950: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
3960: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
3970: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
3980: 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72  er files..*/.str
3990: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71  uct Pager {.  sq
39a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
39b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20            /* OS 
39c0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65  functions to use
39d0: 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20   for IO */.  u8 
39e0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
3a00: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
3a10: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
3a20: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  SIVE */.  u8 jou
3a30: 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rnalMode;       
3a40: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74        /* On of t
3a50: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
3a60: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
3a70: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
3a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3a90: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
3aa0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
3ab0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
3ac0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
3ad0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
3ae0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
3af0: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
3b00: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b20: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
3b30: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
3b40: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
3b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b60: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
3b70: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
3b80: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
3b90: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
3ba0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
3bb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
3bc0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
3bd0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d  FULL */.  u8 tem
3be0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
3bf0: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
3c00: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
3c10: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
3c20: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
3c30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3c40: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
3c50: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3c60: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
3c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3c80: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
3c90: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
3ca0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
3cb0: 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20   block contains 
3cc0: 74 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62  those class memb
3cd0: 65 72 73 20 74 68 61 74 20 61 72 65 20 64 79 6e  ers that are dyn
3ce0: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f  amically.  ** mo
3cf0: 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f  dified during no
3d00: 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e  rmal operations.
3d10: 20 54 68 65 20 6f 74 68 65 72 20 76 61 72 69 61   The other varia
3d20: 62 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74 72  bles in this str
3d30: 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20  ucture.  ** are 
3d40: 65 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20  either constant 
3d50: 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c  throughout the l
3d60: 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70  ifetime of the p
3d70: 61 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20  ager, or else.  
3d80: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
3d90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70   configuration p
3da0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
3db0: 66 66 65 63 74 20 74 68 65 20 77 61 79 20 74 68  ffect the way th
3dc0: 65 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70  e pager .  ** op
3dd0: 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  erates..  **.  *
3de0: 2a 20 54 68 65 20 27 73 74 61 74 65 27 20 76 61  * The 'state' va
3df0: 72 69 61 62 6c 65 20 69 73 20 64 65 73 63 72 69  riable is descri
3e00: 62 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61  bed in more deta
3e10: 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  il along with th
3e20: 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69  e.  ** descripti
3e30: 6f 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ons of the value
3e40: 73 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20  s it may take - 
3e50: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63  PAGER_UNLOCK etc
3e60: 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20  . Many of the.  
3e70: 2a 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  ** other variabl
3e80: 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b  es in this block
3e90: 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20 69   are described i
3ea0: 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69  n the comment di
3eb0: 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f  rectly .  ** abo
3ec0: 76 65 20 74 68 69 73 20 63 6c 61 73 73 20 64 65  ve this class de
3ed0: 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  finition..  */. 
3ee0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f00: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53  PAGER_UNLOCK, _S
3f10: 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44  HARED, _RESERVED
3f20: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64  , etc. */.  u8 d
3f30: 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20  bModified;      
3f40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f50: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
3f60: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3f70: 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  Db */.  u8 needS
3f80: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3f90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
3fa0: 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65  n fsync() is nee
3fb0: 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  ded on the journ
3fc0: 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  al */.  u8 journ
3fd0: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3fe0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3ff0: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
4000: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
4010: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
4020: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
4030: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
4040: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
4050: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
4060: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
4070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4080: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
4090: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
40a0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
40b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
40c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
40d0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
40e0: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
40f0: 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  o */.  u8 doNotS
4100: 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20 20  yncSpill;       
4110: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20     /* Do not do 
4120: 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65 71  a spill that req
4130: 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63 20  uires jrnl sync 
4140: 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61  */.  u8 dbSizeVa
4150: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
4160: 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53   /* Set when dbS
4170: 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a  ize is correct *
4180: 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d  /.  u8 subjInMem
4190: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ory;            
41a0: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69  /* True to use i
41b0: 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
41c0: 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  rnals */.  Pgno 
41d0: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
41e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
41f0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
4200: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
4210: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
4220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
4230: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
4240: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
4250: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
4260: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
4270: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4280: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
4290: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
42a0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42c0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
42d0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
42e0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
4310: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
4320: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
4330: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
4340: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
4350: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
4360: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
4370: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
4380: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
4390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
43b0: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
43c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
43d0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
43e0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
43f0: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
4400: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
4410: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4420: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
4430: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
4440: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
4450: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
4460: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4470: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
4480: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
4490: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
44a0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
44b0: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
44c0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
44d0: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
44e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
44f0: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
4500: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4510: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
4520: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
4530: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
4540: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
4550: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
4560: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
4570: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
4580: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
4590: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  zeLimit;       /
45a0: 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  * Size limit for
45b0: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
45c0: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50  nal files */.  P
45d0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
45e0: 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72  Savepoint; /* Ar
45f0: 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61  ray of active sa
4600: 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  vepoints */.  in
4610: 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  t nSavepoint;   
4620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4630: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4640: 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  in aSavepoint[] 
4650: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
4660: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
4670: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
4680: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
4690: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  le changes */.  
46a0: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
46c0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
46d0: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
46e0: 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ck */..  u16 nEx
46f0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
4700: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4710: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
4720: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
4730: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
4740: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
4750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4760: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
4770: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
4780: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
4790: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
47a0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
47b0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
47c0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  n() */.  int pag
47d0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
47e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
47f0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
4800: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
4810: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
4820: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
4830: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
4840: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
4850: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
4860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4870: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
4880: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
4890: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
48a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
48b0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
48c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
48d0: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
48e0: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
48f0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
4900: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
4910: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
4920: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
4930: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
4940: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69  usyHandler */.#i
4950: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4960: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
4970: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ss;            /
4980: 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64  * Cache hits and
4990: 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e   missing */.  in
49a0: 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b  t nRead, nWrite;
49b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
49c0: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
49d0: 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64  /written */.#end
49e0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
49f0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
4a00: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
4a10: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
4a20: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
4a30: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
4a40: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
4a50: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
4a60: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
4a70: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
4a80: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
4a90: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
4aa0: 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
4ab0: 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f  ,int,int); /* No
4ac0: 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a  tify of page siz
4ad0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76  e changes */.  v
4ae0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
4af0: 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20  )(void*);       
4b00: 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
4b10: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65  tor for the code
4b20: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  c */.  void *pCo
4b30: 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  dec;            
4b40: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
4b50: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e  ment to xCodec..
4b60: 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e  . methods */.#en
4b70: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
4b80: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
4b90: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
4ba0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
4bb0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
4bc0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
4bd0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
4be0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
4bf0: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
4c00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  */.  sqlite3_bac
4c10: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20  kup *pBackup;   
4c20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c   /* Pointer to l
4c30: 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62  ist of ongoing b
4c40: 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
4c50: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4c60: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c  E_OMIT_WAL.  Wal
4c70: 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *pWal;         
4c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
4c90: 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64  e-ahead log used
4ca0: 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   by "journal_mod
4cb0: 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72  e=wal" */.  char
4cc0: 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *zWal;         
4cd0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
4ce0: 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61  name for write-a
4cf0: 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64  head log */.#end
4d00: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  if.};../*.** The
4d10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
4d20: 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  l variables hold
4d30: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66   counters used f
4d40: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75  or.** testing pu
4d50: 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68  rposes only.  Th
4d60: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f  ese variables do
4d70: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a   not exist in.**
4d80: 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62   a non-testing b
4d90: 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72  uild.  These var
4da0: 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74  iables are not t
4db0: 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23  hread-safe..*/.#
4dc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4dd0: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  T.int sqlite3_pa
4de0: 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
4df0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
4e00: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
4e10: 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f   read from DB */
4e20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4e30: 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
4e40: 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
4e50: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
4e60: 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f  written to DB */
4e70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4e80: 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20  er_writej_count 
4e90: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
4ea0: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
4eb0: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
4ec0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
4ed0: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
4ee0: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
4ef0: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
4f00: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  ..../*.** Journa
4f10: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
4f20: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
4f30: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
4f40: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
4f50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
4f60: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
4f70: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
4f80: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
4f90: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
4fa0: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
4fb0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
4fc0: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
4fd0: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
4fe0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
4ff0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
5000: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
5010: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a  ournal is being.
5020: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
5030: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
5040: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
5050: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
5060: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
5070: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
5080: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
5090: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
50a0: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
50b0: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
50c0: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
50d0: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
50e0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
50f0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
5100: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
5110: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
5120: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
5130: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
5140: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
5150: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
5160: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
5170: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
5180: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
5190: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
51a0: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
51b0: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
51c0: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
51d0: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
51e0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
51f0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
5200: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
5210: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
5220: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
5230: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
5240: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
5250: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
5260: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
5270: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
5280: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
5290: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
52a0: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
52b0: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
52c0: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
52d0: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
52e0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
52f0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
5300: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
5310: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
5320: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
5330: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
5340: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
5350: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
5360: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
5370: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
5380: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
5390: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
53a0: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
53b0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
53c0: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
53d0: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
53e0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
53f0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
5400: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
5410: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
5420: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5430: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
5440: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
5450: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
5460: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
5470: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
5480: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
5490: 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65  the of each page
54a0: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a   record in the j
54b0: 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20  ournal is given 
54c0: 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  by.** the follow
54d0: 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64  ing macro..*/.#d
54e0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
54f0: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
5500: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
5510: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
5520: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5530: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
5540: 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75  ger. This is usu
5550: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a  ally the same .*
5560: 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67  * size as a sing
5570: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
5580: 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74  See also setSect
5590: 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65  orSize()..*/.#de
55a0: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
55b0: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
55c0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
55d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
55e0: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
55f0: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
5600: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
5610: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
5620: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
5630: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
5640: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
5650: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
5660: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
5670: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
5680: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
5690: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
56a0: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
56b0: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
56c0: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
56d0: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
56e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
56f0: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
5700: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
5710: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
5720: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
5730: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
5740: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
5750: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
5760: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
5770: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
5780: 31 34 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64  147483647..#ifnd
5790: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
57a0: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
57b0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
57c0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
57d0: 72 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  r) );.*/.static 
57e0: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
57f0: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50  _state(Pager *pP
5800: 61 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74  ager){..  /* A t
5810: 65 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61  emp-file is alwa
5820: 79 73 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c  ys in PAGER_EXCL
5830: 55 53 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53  USIVE or PAGER_S
5840: 59 4e 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a  YNCED state. */.
5850: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
5860: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
5870: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
5880: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
5890: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61  );..  /* The cha
58a0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
58b0: 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  g is always set 
58c0: 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a  for temp-files *
58d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
58e0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
58f0: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
5900: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
5910: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
5920: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
5930: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
5940: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
5950: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
5960: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
5970: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
5980: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
5990: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
59a0: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
59b0: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
59c0: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
59d0: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
59e0: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
59f0: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
5a00: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
5a10: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
5a20: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
5a30: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
5a40: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
5a50: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
5a60: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
5a70: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
5a80: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
5a90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
5aa0: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
5ab0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e  Hdr *pPg){.  Pgn
5ac0: 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
5ad0: 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
5ae0: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
5af0: 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  r;.  int i;.  fo
5b00: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
5b10: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
5b20: 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  ){.    PagerSave
5b30: 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67  point *p = &pPag
5b40: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
5b50: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
5b60: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
5b70: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
5b80: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
5b90: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
5ba0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
5bb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
5bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5bd0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
5be0: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
5bf0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5c00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5c10: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
5c20: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
5c30: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
5c40: 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67  ecTest(pPg->pPag
5c50: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
5c60: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f  pPg->pgno);.}../
5c70: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
5c80: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
5c90: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
5ca0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
5cb0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
5cc0: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
5cd0: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
5ce0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
5cf0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
5d00: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
5d10: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
5d20: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
5d30: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
5d40: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
5d50: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
5d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5d70: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
5d80: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
5d90: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
5da0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
5db0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
5dc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5dd0: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
5de0: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
5df0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5e00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
5e10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
5e20: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
5e30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5e40: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
5e50: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
5e60: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
5e70: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
5e80: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
5e90: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
5ea0: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
5eb0: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a  te((u8*)A,B)../*
5ec0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
5ed0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
5ee0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
5ef0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
5f00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
5f10: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
5f20: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
5f30: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5f40: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
5f50: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73  nt write32bits(s
5f60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
5f70: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
5f80: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
5f90: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
5fa0: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
5fb0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
5fc0: 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66  te(fd, ac, 4, of
5fd0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
5fe0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
5ff0: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
6000: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6010: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
6020: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
6030: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
6040: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
6050: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
6060: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
6070: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
6080: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
6090: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
60a0: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
60b0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
60c0: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
60d0: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
60e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
60f0: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
6100: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
6110: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
6120: 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  hods)../*.** If 
6130: 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e  file pFd is open
6140: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73  , call sqlite3Os
6150: 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a  Unlock() on it..
6160: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  */.static int os
6170: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
6180: 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c  ile *pFd, int eL
6190: 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f  ock){.  if( !isO
61a0: 70 65 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20  pen(pFd) ){.    
61b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
61c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
61d0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
61e0: 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f  Fd, eLock);.}../
61f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6200: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  on determines wh
6210: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
6220: 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
6230: 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61  timization.** ca
6240: 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74  n be used with t
6250: 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f  his pager. The o
6260: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
6270: 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a  be used if:.**.*
6280: 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65  *  (a) the value
6290: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44   returned by OsD
62a0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
62b0: 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73  tics() indicates
62c0: 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20   that.**      a 
62d0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61  database page ma
62e0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  y be written ato
62f0: 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20  mically, and.** 
6300: 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72   (b) the value r
6310: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63  eturned by OsSec
6320: 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73  torSize() is les
6330: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
6340: 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70  **      to the p
6350: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
6360: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
6370: 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20   is also always 
6380: 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70  enabled for temp
6390: 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20  orary files. It 
63a0: 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74  is.** an error t
63b0: 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  o call this func
63c0: 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69  tion if pPager i
63d0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69  s opened on an i
63e0: 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61  n-memory.** data
63f0: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  base..**.** If t
6400: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
6410: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
6420: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  0 is returned. I
6430: 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  f it can be used
6440: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61  ,.** then the va
6450: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
6460: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6470: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
6480: 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  n it.** contains
6490: 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66   rollback data f
64a0: 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70  or exactly one p
64b0: 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  age..*/.#ifdef S
64c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
64d0: 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63  MIC_WRITE.static
64e0: 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53   int jrnlBufferS
64f0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
6500: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  r){.  assert( !M
6510: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70  EMDB );.  if( !p
6520: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
6530: 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20  ){.    int dc;  
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
6560: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
6570: 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  cs */.    int nS
6580: 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ector;          
6590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
65a0: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
65b0: 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20    int szPage;   
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
65e0: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
65f0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
6600: 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20  fd) );.    dc = 
6610: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
6620: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
6630: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
6640: 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72  nSector = pPager
6650: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
6660: 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65    szPage = pPage
6670: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20  r->pageSize;..  
6680: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
6690: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
66a0: 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20  =(512>>8));.    
66b0: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
66c0: 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
66d0: 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
66e0: 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49  if( 0==(dc&(SQLI
66f0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
6700: 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20  (szPage>>8)) || 
6710: 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20  nSector>szPage) 
6720: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6730: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
6740: 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48  return JOURNAL_H
6750: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
6760: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
6770: 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ager);.}.#endif.
6780: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
6790: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20  _CHECK_PAGES is 
67a0: 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20  defined then we 
67b0: 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63  do some sanity c
67c0: 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  hecking.** on th
67d0: 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20  e cache using a 
67e0: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20  hash function.  
67f0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
6800: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20   testing.** and 
6810: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
6820: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
6830: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
6840: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
6850: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
6860: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
6870: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
6880: 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  2 pager_datahash
6890: 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69  (int nByte, unsi
68a0: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
68b0: 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20  ){.  u32 hash = 
68c0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
68d0: 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20  r(i=0; i<nByte; 
68e0: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
68f0: 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70   (hash*1039) + p
6900: 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  Data[i];.  }.  r
6910: 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74  eturn hash;.}.st
6920: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70  atic u32 pager_p
6930: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
6940: 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
6950: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
6960: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
6970: 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65  geSize, (unsigne
6980: 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e  d char *)pPage->
6990: 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63  pData);.}.static
69a0: 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f   void pager_set_
69b0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
69c0: 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d  pPage){.  pPage-
69d0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
69e0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65  r_pagehash(pPage
69f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
6a00: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
6a10: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
6a20: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
6a30: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
6a40: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
6a50: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
6a60: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
6a70: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
6a80: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
6a90: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
6aa0: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
6ab0: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
6ac0: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
6ad0: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
6ae0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
6af0: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
6b00: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
6b10: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
6b20: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
6b30: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
6b40: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
6b50: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
6b60: 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  ger->errCode.   
6b70: 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67     || (pPg->flag
6b80: 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c  s&PGHDR_DIRTY) |
6b90: 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d  | pPg->pageHash=
6ba0: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
6bb0: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
6bc0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64  .#define pager_d
6bd0: 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a  atahash(X,Y)  0.
6be0: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61  #define pager_pa
6bf0: 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65  gehash(X)  0.#de
6c00: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
6c10: 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51  x).#endif  /* SQ
6c20: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
6c30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20   */../*.** When 
6c40: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
6c50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6c60: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
6c70: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
6c80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6c90: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64  attempts to read
6ca0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
6cb0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d  l file name from
6cc0: 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20   the .** end of 
6cd0: 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66  the file and, if
6ce0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70   successful, cop
6cf0: 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  ies it into memo
6d00: 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ry supplied .** 
6d10: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
6d20: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
6d30: 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  e writeMasterJou
6d40: 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66  rnal() for the f
6d50: 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f  ormat.** used to
6d60: 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20   store a master 
6d70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
6d80: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
6d90: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
6da0: 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75  **.** zMaster mu
6db0: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
6dc0: 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
6dd0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61   nMaster bytes a
6de0: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
6df0: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20  he caller. This 
6e00: 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65  should be sqlite
6e10: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
6e20: 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68  +1 (to ensure th
6e30: 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68  ere is.** enough
6e40: 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20   space to write 
6e50: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6e60: 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65  al name). If the
6e70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
6e80: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a  ** name in the j
6e90: 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72  ournal is longer
6ea0: 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79   than nMaster by
6eb0: 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61  tes (including a
6ec0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
6ed0: 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69  or), then this i
6ee0: 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  s handled as if 
6ef0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
6f00: 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70  l name.** were p
6f10: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f  resent in the jo
6f20: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
6f30: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
6f40: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
6f50: 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  esent at the end
6f60: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
6f70: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  ** file, then it
6f80: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
6f90: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
6fa0: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
6fb0: 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  . A.** nul-termi
6fc0: 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70  nator byte is ap
6fd0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
6fe0: 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ffer following t
6ff0: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
7000: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  rnal file name..
7010: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64  **.** If it is d
7020: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
7030: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
7040: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
7050: 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65  esent .** zMaste
7060: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
7070: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
7080: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
7090: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
70a0: 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  s while reading 
70b0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
70c0: 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65   file, an SQLite
70d0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
70e0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
70f0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
7100: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
7110: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
7120: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
7130: 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  u32 nMaster){.  
7140: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
7150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7160: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
7170: 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
7180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
7190: 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20  gth in bytes of 
71a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
71b0: 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a  ame */.  i64 szJ
71c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
71d0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
71e0: 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f  e in bytes of jo
71f0: 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c  urnal file pJrnl
7200: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20   /* MJ checksum 
7230: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
7240: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
7250: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
7260: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
7270: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
7280: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
7290: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
72a0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
72b0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
72c0: 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74  eader */.  zMast
72d0: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
72e0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
72f0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
7300: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
7310: 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c  szJ)).   || szJ<
7320: 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  16.   || SQLITE_
7330: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
7340: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
7350: 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c  16, &len)).   ||
7360: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20   len>=nMaster . 
7370: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
7380: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
7390: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
73a0: 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53  &cksum)).   || S
73b0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
73c0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
73d0: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  rnl, aMagic, 8, 
73e0: 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65  szJ-8)).   || me
73f0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
7400: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20  urnalMagic, 8). 
7410: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
7420: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
7430: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
7440: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
7450: 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  len)).  ){.    r
7460: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
7470: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
7480: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
7490: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
74a0: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
74b0: 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b  (u=0; u<len; u++
74c0: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
74d0: 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a  zMaster[u];.  }.
74e0: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
74f0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
7500: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
7510: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
7520: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
7530: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
7540: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
7550: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7560: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
7570: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
7580: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
7590: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
75a0: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
75b0: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
75c0: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
75d0: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
75e0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
75f0: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20  /.    len = 0;. 
7600: 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e   }.  zMaster[len
7610: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20  ] = '\0';.   .  
7620: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7640: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  n the offset of 
7650: 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  the sector bound
7660: 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69  ary at or immedi
7670: 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  ately .** follow
7680: 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ing the value in
7690: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
76a0: 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20  Off, assuming a 
76b0: 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20  sector .** size 
76c0: 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  of pPager->secto
76d0: 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  rSize bytes..**.
76e0: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
76f0: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
7700: 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a  .**.**   Pager.j
7710: 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20  ournalOff       
7720: 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a     Return value.
7730: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
7760: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
7770: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
7780: 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20     512          
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
77a0: 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20  .**   100       
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20  512.**   2000   
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
77f0: 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61  tatic i64 journa
7800: 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72  lHdrOffset(Pager
7810: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
7820: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
7830: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
7840: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
7850: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
7860: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
7870: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7880: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
7890: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
78a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
78b0: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
78c0: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
78d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
78e0: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
78f0: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
7900: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7910: 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
7920: 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   offset;.}../*.*
7930: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
7940: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
7950: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
7960: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
7970: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7980: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
7990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
79a0: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72   has not been wr
79b0: 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68  itten to.** with
79c0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
79d0: 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e  ransaction (i.e.
79e0: 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   if Pager.journa
79f0: 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20  lOff==0)..**.** 
7a00: 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73  If doTruncate is
7a10: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65   non-zero or the
7a20: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
7a30: 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65  zeLimit variable
7a40: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c   is.** set to 0,
7a50: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
7a60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7a70: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
7a80: 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65   size. Otherwise
7a90: 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38  ,.** zero the 28
7aa0: 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20  -byte header at 
7ab0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
7ac0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
7ad0: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a  n either case, .
7ae0: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
7af0: 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  is not in no-syn
7b00: 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  c mode, sync the
7b10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
7b20: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66  mediately .** af
7b30: 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74  ter writing or t
7b40: 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a  runcating it..**
7b50: 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75  .** If Pager.jou
7b60: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73  rnalSizeLimit is
7b70: 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69   set to a positi
7b80: 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ve, non-zero val
7b90: 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f  ue, and.** follo
7ba0: 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74  wing the truncat
7bb0: 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64  ion or zeroing d
7bc0: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74  escribed above t
7bd0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
7be0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
7bf0: 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67  in bytes is larg
7c00: 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
7c10: 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74  ue, then truncat
7c20: 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
7c30: 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a   file to Pager.j
7c40: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
7c50: 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e  bytes. The journ
7c60: 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
7c70: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73  not need to be s
7c80: 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
7c90: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
7ca0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
7cb0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61  rror occurs, aba
7cc0: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
7cd0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49  and return the I
7ce0: 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  O error code..**
7cf0: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
7d00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
7d10: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f  .static int zero
7d20: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
7d30: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f   *pPager, int do
7d40: 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74  Truncate){.  int
7d50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7d80: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
7d90: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
7da0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
7db0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7dc0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
7dd0: 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d    const i64 iLim
7de0: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  it = pPager->jou
7df0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
7e00: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
7e10: 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20   of jsl */..    
7e20: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
7e30: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
7e40: 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75  )).    if( doTru
7e50: 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d  ncate || iLimit=
7e60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
7e70: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
7e80: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
7e90: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
7ea0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
7eb0: 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32  t char zeroHdr[2
7ec0: 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20  8] = {0};.      
7ed0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
7ee0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7ef0: 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66   zeroHdr, sizeof
7f00: 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20  (zeroHdr), 0);. 
7f10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
7f20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
7f30: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
7f40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7f50: 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
7f60: 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
7f70: 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67  NC_DATAONLY|pPag
7f80: 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
7f90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
7fa0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
7fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7fc0: 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68  committed but th
7fd0: 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20  e write lock .  
7fe0: 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65    ** is still he
7ff0: 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  ld on the file. 
8000: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69  If there is a si
8010: 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75  ze limit configu
8020: 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  red for .    ** 
8030: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a  the persistent j
8040: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a  ournal and the j
8050: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72  ournal file curr
8060: 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d  ently consumes m
8070: 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  ore.    ** space
8080: 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74   than that limit
8090: 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75   allows for, tru
80a0: 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68  ncate it now. Th
80b0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
80c0: 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68     ** to sync th
80d0: 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67  e file following
80e0: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
80f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8100: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8110: 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20   iLimit>0 ){.   
8120: 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20     i64 sz;.     
8130: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
8140: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
8150: 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20  jfd, &sz);.     
8160: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8170: 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20  OK && sz>iLimit 
8180: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8190: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
81a0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  e(pPager->jfd, i
81b0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Limit);.      }.
81c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
81d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
81e0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
81f0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
8200: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8210: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
8220: 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28  rnal.** header (
8230: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
8240: 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e  ytes) is written
8250: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
8260: 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a  l file at the.**
8270: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
8280: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
8290: 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  mat for the jour
82a0: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73  nal header is as
82b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38   follows:.** - 8
82c0: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
82d0: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
82e0: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34  l format..** - 4
82f0: 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
8300: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
8310: 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
8320: 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
8330: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61  ** - 4 bytes: Ra
8340: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64  ndom number used
8350: 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a   for page hash..
8360: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
8370: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
8380: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20  age count..** - 
8390: 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20  4 bytes: Sector 
83a0: 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
83b0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
83c0: 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ote this journal
83d0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
83e0: 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  Database page si
83f0: 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  ze..** .** Follo
8400: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
8410: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
8420: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
8430: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
8440: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
8450: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
8460: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
8470: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
8480: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
8490: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  n code */.  char
84a0: 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67   *zHeader = pPag
84b0: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
84c0: 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61  /* Temporary spa
84d0: 63 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  ce used to build
84e0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
84f0: 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
8500: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20  r->pageSize;    
8510: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
8520: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
8530: 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33   zHeader */.  u3
8540: 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  2 nWrite;       
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65    /* Bytes of he
8570: 61 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74  ader sector writ
8580: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ten */.  int ii;
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85b0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
85c0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
85d0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
85e0: 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  ;      /* Journa
85f0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
8600: 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e  pen. */..  if( n
8610: 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48  Header>JOURNAL_H
8620: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
8630: 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a  .    nHeader = J
8640: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
8650: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
8660: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
8670: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
8680: 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  and any of them 
8690: 77 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20  were created .  
86a0: 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73  ** since the mos
86b0: 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c  t recent journal
86c0: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
86d0: 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20  ten, update the 
86e0: 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
86f0: 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
8700: 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f  fields now..  */
8710: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
8720: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
8730: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  nt; ii++){.    i
8740: 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65  f( pPager->aSave
8750: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
8760: 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fset==0 ){.     
8770: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
8780: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
8790: 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  et = pPager->jou
87a0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
87b0: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
87c0: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
87d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
87e0: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
87f0: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
8800: 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20  .  ** Write the 
8810: 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65  nRec Field - the
8820: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
8830: 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c  records that fol
8840: 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f  low this.  ** jo
8850: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f  urnal header. No
8860: 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20  rmally, zero is 
8870: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20  written to this 
8880: 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69  value at this ti
8890: 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74  me..  ** After t
88a0: 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61  he records are a
88b0: 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  dded to the jour
88c0: 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75  nal (and the jou
88d0: 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20  rnal synced, .  
88e0: 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79  ** if in full-sy
88f0: 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65  nc mode), the ze
8900: 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  ro is overwritte
8910: 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20  n with the true 
8920: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72  number.  ** of r
8930: 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63  ecords (see sync
8940: 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a  Journal())..  **
8950: 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61  .  ** A faster a
8960: 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f  lternative is to
8970: 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46   write 0xFFFFFFF
8980: 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69  F to the nRec fi
8990: 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72  eld. When.  ** r
89a0: 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eading the journ
89b0: 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65  al this value te
89c0: 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73  lls SQLite to as
89d0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20  sume that the.  
89e0: 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  ** rest of the j
89f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
8a00: 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20  ains valid page 
8a10: 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73  records. This as
8a20: 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  sumption.  ** is
8a30: 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69   dangerous, as i
8a40: 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
8a50: 72 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  rred whilst writ
8a60: 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
8a70: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20  al.  ** file it 
8a80: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65  may contain some
8a90: 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54   garbage data. T
8aa0: 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65  here are two sce
8ab0: 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72  narios.  ** wher
8ac0: 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20  e this risk can 
8ad0: 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a  be ignored:.  **
8ae0: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
8af0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
8b00: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72  o-sync mode. Cor
8b10: 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c  ruption can foll
8b20: 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f  ow a.  **     po
8b30: 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74  wer failure in t
8b40: 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e  his case anyway.
8b50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
8b60: 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49  hen the SQLITE_I
8b70: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
8b80: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68   flag is set. Th
8b90: 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20  is guarantees.  
8ba0: 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62  **     that garb
8bb0: 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65  age data is neve
8bc0: 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  r appended to th
8bd0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
8be0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
8bf0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
8c00: 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ) || pPager->noS
8c10: 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50  ync );.  if( (pP
8c20: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c  ager->noSync) ||
8c30: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
8c40: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
8c50: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
8c60: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
8c70: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
8c80: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
8c90: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
8ca0: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
8cb0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
8cc0: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
8cd0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
8ce0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
8cf0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
8d00: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
8d10: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
8d20: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
8d30: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
8d40: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
8d50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
8d60: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
8d70: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
8d80: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
8d90: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
8da0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
8db0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
8dc0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
8dd0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
8de0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
8df0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
8e00: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
8e10: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
8e20: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
8e30: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
8e40: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8e50: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8e60: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
8e70: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
8e80: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
8e90: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
8ea0: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
8eb0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
8ec0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
8ed0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
8ee0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
8ef0: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
8f00: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
8f10: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
8f20: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
8f30: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
8f40: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8f50: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
8f60: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
8f70: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
8f80: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
8f90: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
8fa0: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
8fb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
8fc0: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
8fd0: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
8fe0: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
8ff0: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
9000: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
9010: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
9020: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
9030: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
9040: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
9050: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
9060: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9070: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
9080: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
9090: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
90a0: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
90b0: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
90c0: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
90d0: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
90e0: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
90f0: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
9100: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
9110: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
9120: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
9130: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
9140: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
9150: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
9160: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
9170: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
9180: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
9190: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
91a0: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
91b0: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
91c0: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
91d0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
91e0: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
91f0: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
9200: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
9210: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
9220: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
9230: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
9240: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
9250: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
9260: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
9270: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
9280: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
9290: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
92a0: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
92b0: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
92c0: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
92d0: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
92e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
92f0: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
9300: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
9310: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
9320: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
9330: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
9340: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
9350: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
9360: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
9370: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
9380: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
9390: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
93a0: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
93b0: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
93c0: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
93d0: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
93e0: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
93f0: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
9400: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
9410: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
9420: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
9430: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
9440: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
9450: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
9460: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
9470: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
9480: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
9490: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
94a0: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
94b0: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
94c0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
94d0: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
94e0: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
94f0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9500: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
9510: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
9520: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
9530: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9540: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
9550: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9560: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
9570: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9580: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
9590: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
95a0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
95b0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
95c0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
95d0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
95e0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
95f0: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
9600: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
9610: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
9620: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
9630: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
9640: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
9650: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
9660: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
9670: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
9680: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
9690: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
96a0: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
96b0: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
96c0: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
96d0: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
96e0: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
96f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
9700: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
9710: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
9720: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
9730: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
9740: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
9750: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
9760: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
9770: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
9780: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
9790: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
97a0: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
97b0: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
97c0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
97d0: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
97e0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
97f0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
9800: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
9810: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
9820: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
9830: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
9840: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
9850: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
9860: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
9870: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
9880: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
9890: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
98a0: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
98b0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
98c0: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
98d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
98e0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
98f0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
9900: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
9910: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
9920: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
9930: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
9940: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
9950: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
9960: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
9970: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
9980: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
9990: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
99a0: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
99b0: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99d0: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
99e0: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
99f0: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
9a00: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
9a10: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
9a20: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
9a30: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
9a40: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
9a50: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
9a70: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
9a80: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
9a90: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
9aa0: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
9ab0: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
9ac0: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
9ad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9ae0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
9af0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
9b00: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
9b10: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
9b20: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
9b30: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
9b40: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
9b50: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
9b60: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
9b70: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
9b80: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
9b90: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
9ba0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9bb0: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
9bc0: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
9bd0: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
9be0: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
9bf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
9c00: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
9c10: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
9c20: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
9c30: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
9c40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9c50: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
9c60: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
9c70: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
9c80: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
9c90: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
9ca0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9cb0: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
9cc0: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
9cd0: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
9ce0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
9cf0: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
9d00: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
9d10: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
9d20: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
9d30: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
9d40: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
9d50: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
9d60: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
9d70: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
9d80: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
9d90: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
9da0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
9db0: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
9dc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
9dd0: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
9de0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
9df0: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
9e00: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
9e10: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
9e20: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
9e30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
9e40: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
9e50: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
9e60: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
9e70: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
9e80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9e90: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
9ea0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
9eb0: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
9ec0: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
9ed0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
9ee0: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
9ef0: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
9f00: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
9f10: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
9f20: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
9f30: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
9f40: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
9f50: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
9f60: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
9f70: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
9f80: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
9f90: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
9fa0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
9fb0: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
9fc0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
9fd0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
9fe0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
9ff0: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
a000: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
a010: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
a020: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a030: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
a040: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
a050: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
a060: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
a070: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
a080: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
a090: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a0b0: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
a0c0: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
a0d0: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
a0e0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
a0f0: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
a100: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
a110: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
a120: 20 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65     u16 iPageSize
a130: 31 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  16;             
a140: 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65  /* Copy of iPage
a150: 53 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76  Size in 16-bit v
a160: 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  ariable */..    
a170: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
a180: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
a190: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
a1a0: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
a1b0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
a1c0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
a1d0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
a1e0: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
a1f0: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
a200: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
a210: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a220: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
a230: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
a240: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
a250: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a260: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
a270: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
a280: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
a290: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
a2a0: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
a2b0: 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
a2c0: 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
a2d0: 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
a2e0: 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
a2f0: 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
a300: 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
a310: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
a320: 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
a330: 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
a340: 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
a350: 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
a360: 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
a370: 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
a380: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
a390: 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
a3a0: 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
a3b0: 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
a3c0: 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
a3d0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
a3e0: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
a3f0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
a400: 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
a410: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
a420: 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
a430: 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
a440: 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
a450: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
a460: 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
a470: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
a480: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
a490: 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
a4a0: 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
a4b0: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
a4c0: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
a4d0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
a4e0: 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
a4f0: 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
a500: 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
a510: 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
a520: 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
a530: 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
a540: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
a550: 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
a560: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a570: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
a580: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
a590: 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
a5a0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
a5b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
a5c0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
a5d0: 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
a5e0: 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
a5f0: 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
a600: 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
a610: 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
a620: 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
a630: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61  ..    */.    iPa
a640: 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29  geSize16 = (u16)
a650: 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  iPageSize;.    r
a660: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
a670: 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
a680: 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36  er, &iPageSize16
a690: 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
a6a0: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
a6b0: 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OK );.    assert
a6c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a6d0: 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d  || iPageSize16==
a6e0: 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29  (u16)iPageSize )
a6f0: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
a700: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
a710: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
a720: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
a730: 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
a740: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
a750: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
a760: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
a770: 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
a780: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
a790: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
a7a0: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
a7b0: 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
a7c0: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
a7d0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
a7e0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
a7f0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
a800: 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
a810: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
a820: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
a830: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
a840: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
a850: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
a860: 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
a870: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
a880: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
a890: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
a8a0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
a8b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
a8c0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
a8d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
a8e0: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
a8f0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
a900: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
a910: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
a920: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
a930: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
a940: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
a950: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
a960: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
a970: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
a980: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
a990: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
a9a0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
a9b0: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
a9c0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
a9d0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
a9e0: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
a9f0: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
aa00: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
aa10: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
aa20: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
aa30: 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
aa40: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
aa50: 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
aa60: 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
aa70: 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
aa80: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
aa90: 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
aaa0: 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
aab0: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
aac0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
aad0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
aae0: 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
aaf0: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
ab00: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
ab10: 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
ab20: 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
ab30: 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
ab40: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
ab50: 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
ab60: 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
ab70: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
ab80: 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
ab90: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
aba0: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
abb0: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
abc0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
abd0: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
abe0: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
abf0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
ac00: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
ac10: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
ac20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
ac30: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
ac40: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ac70: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
ac80: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
ac90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
aca0: 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
acb0: 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
acc0: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ace0: 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
acf0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
ad00: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
ad10: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
ad20: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ad30: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
ad40: 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
ad50: 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad70: 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
ad80: 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
ad90: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
ada0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
adb0: 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  er.   || pPager-
adc0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
add0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
ade0: 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50  MEMORY .   || pP
adf0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ae00: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ae10: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20  MODE_OFF .  ){. 
ae20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ae30: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
ae40: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
ae50: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
ae60: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
ae70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ae80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
ae90: 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
aea0: 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
aeb0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
aec0: 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
aed0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
aee0: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
aef0: 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
af00: 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
af10: 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
af20: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
af30: 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
af40: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
af50: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
af60: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
af70: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
af80: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
af90: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
afa0: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
afb0: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
afc0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
afd0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
afe0: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
aff0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
b000: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
b010: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
b020: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b030: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
b040: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
b050: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
b060: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b070: 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
b080: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b090: 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
b0a0: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
b0b0: 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
b0c0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
b0d0: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
b0e0: 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
b0f0: 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
b100: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
b110: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
b120: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
b130: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
b140: 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
b150: 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
b160: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
b170: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
b180: 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
b190: 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
b1a0: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
b1b0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
b1c0: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
b1d0: 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
b1e0: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
b1f0: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
b200: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
b210: 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
b220: 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
b230: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
b240: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
b250: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
b260: 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
b270: 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
b280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
b290: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
b2a0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
b2b0: 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50  Master+20);.  pP
b2c0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
b2d0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
b2e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
b2f0: 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
b300: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
b310: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
b320: 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
b330: 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
b340: 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
b350: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
b360: 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
b370: 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
b380: 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
b390: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
b3a0: 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
b3b0: 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
b3c0: 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
b3d0: 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
b3e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
b3f0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
b400: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
b410: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
b420: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
b430: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
b440: 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
b450: 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
b460: 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
b470: 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
b480: 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
b490: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
b4a0: 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
b4b0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
b4c0: 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
b4d0: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
b4e0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
b4f0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
b500: 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
b510: 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
b520: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
b530: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
b540: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
b550: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
b560: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
b570: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
b590: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
b5a0: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
b5b0: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
b5c0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
b5d0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
b5e0: 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
b5f0: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
b600: 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
b610: 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
b620: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
b630: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
b640: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
b650: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
b680: 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
b690: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
b6a0: 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
b6b0: 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
b6c0: 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
b6d0: 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
b6e0: 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
b6f0: 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
b700: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
b710: 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
b720: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
b730: 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
b740: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
b750: 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
b760: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
b770: 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
b780: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
b790: 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  e, discard all i
b7a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20  n-memory pages. 
b7b0: 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  If.** the pager 
b7c0: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
b7d0: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  e, then this cal
b7e0: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  l is a no-op..**
b7f0: 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61  .** TODO: Why ca
b800: 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74  n we not reset t
b810: 68 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69  he pager while i
b820: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a  n error state?.*
b830: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
b840: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
b850: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
b860: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65  SQLITE_OK==pPage
b870: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
b880: 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
b890: 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
b8a0: 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c  Backup);.    sql
b8b0: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
b8c0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
b8d0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
b8e0: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
b8f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
b900: 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
b910: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
b920: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
b930: 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
b940: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
b950: 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
b960: 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
b970: 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
b980: 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
b990: 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
b9a0: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
b9b0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
b9c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
b9d0: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
b9e0: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
b9f0: 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
ba00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
ba10: 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
ba20: 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
ba30: 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
ba40: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
ba50: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
ba60: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
ba70: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
ba80: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
ba90: 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
baa0: 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
bab0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
bac0: 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
bad0: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
bae0: 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
baf0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
bb00: 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
bb10: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
bb20: 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
bb30: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
bb40: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
bb50: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
bb60: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
bb70: 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
bb80: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
bb90: 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
bba0: 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
bbb0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
bbc0: 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
bbd0: 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
bbe0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
bbf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
bc00: 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
bc10: 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
bc20: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
bc30: 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
bc40: 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
bc50: 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
bc60: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
bc70: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
bc80: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
bc90: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bca0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
bcb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
bcc0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
bcd0: 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
bce0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
bcf0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
bd00: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
bd10: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
bd20: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
bd30: 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
bd40: 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
bd50: 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
bd60: 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
bd70: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
bd80: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
bd90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
bda0: 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
bdb0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
bdc0: 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
bdd0: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
bde0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bdf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
be00: 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67  true if this pag
be10: 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d  er uses a write-
be20: 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61  ahead log instea
be30: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
be40: 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
be50: 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61  al. Otherwise fa
be60: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  lse..*/.#ifndef 
be70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
be80: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
be90: 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50  UseWal(Pager *pP
bea0: 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
beb0: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30  (pPager->pWal!=0
bec0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
bed0: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
bee0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
bef0: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
bf00: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
bf10: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
bf20: 78 2c 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e  x,y,z) 0.# defin
bf30: 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  e pagerOpenWalIf
bf40: 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54  Present(z) SQLIT
bf50: 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61  E_OK.# define pa
bf60: 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
bf70: 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54  saction(z) SQLIT
bf80: 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
bf90: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
bfa0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
bfb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
bfc0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67  no-op if the pag
bfd0: 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c  er.** is in excl
bfe0: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
bff0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
c000: 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65  s currently in e
c010: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63  rror state, disc
c020: 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
c030: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68   of .** the cach
c040: 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
c050: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
c060: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20  internal state. 
c070: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  If there is.** a
c080: 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66  n open journal-f
c090: 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65  ile, then the ne
c0a0: 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64  xt time a shared
c0b0: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
c0c0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65  d.** on the page
c0d0: 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20  r file (by this 
c0e0: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
c0f0: 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62  cess), it will b
c100: 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20  e.** treated as 
c110: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
c120: 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  d rolled back..*
c130: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
c140: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
c150: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
c160: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
c170: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
c180: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c190: 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
c1a0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
c1b0: 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
c1c0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
c1d0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c1e0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c1f0: 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
c200: 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
c210: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
c220: 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
c230: 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
c240: 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
c250: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c260: 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
c270: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
c280: 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
c290: 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
c2a0: 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
c2b0: 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
c2c0: 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
c2d0: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
c2e0: 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
c2f0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
c300: 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
c310: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
c320: 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
c330: 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
c340: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
c350: 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
c360: 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
c370: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
c380: 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
c390: 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
c3a0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
c3b0: 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
c3c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
c3d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
c3e0: 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
c3f0: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
c400: 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
c410: 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
c420: 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
c430: 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
c440: 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
c450: 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
c460: 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
c470: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
c480: 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
c490: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c4a0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c4b0: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42   }..    sqlite3B
c4c0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
c4d0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
c4e0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
c4f0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
c500: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
c510: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
c520: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
c530: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c  ile is unlocked,
c540: 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d   somebody else m
c550: 69 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20  ight change it. 
c560: 54 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  The.    ** value
c570: 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  s stored in Page
c580: 72 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69  r.dbSize etc. mi
c590: 67 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c  ght become inval
c5a0: 69 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69  id if.    ** thi
c5b0: 73 20 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65 20  s happens.  One 
c5c0: 63 61 6e 20 61 72 67 75 65 20 74 68 61 74 20 74  can argue that t
c5d0: 68 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  his doesn't need
c5e0: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20   to be cleared. 
c5f0: 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20     ** until the 
c600: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
c610: 68 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61  heck fails in Pa
c620: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e  gerSharedLock().
c630: 0a 20 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e 67  .    ** Clearing
c640: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63   the page size c
c650: 61 63 68 65 20 68 65 72 65 20 69 73 20 62 65 69  ache here is bei
c660: 6e 67 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  ng conservative.
c670: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
c680: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
c690: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  = 0;..    if( pa
c6a0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
c6b0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
c6c0: 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
c6d0: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
c6e0: 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
c6f0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55  {.      rc = osU
c700: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
c710: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
c720: 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
c730: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
c740: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
c750: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
c760: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
c770: 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49  ager))..    /* I
c780: 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
c790: 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
c7a0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
c7b0: 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
c7c0: 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64  e.    ** trusted
c7d0: 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70  . Now that the p
c7e0: 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c  ager file is unl
c7f0: 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65  ocked, the conte
c800: 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
c810: 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  * cache can be d
c820: 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65  iscarded and the
c830: 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65   error code safe
c840: 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  ly cleared..    
c850: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
c860: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
c870: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c880: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
c890: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
c8a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c8b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65      }.      page
c8c0: 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
c8d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
c8e0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
c8f0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
c900: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
c910: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70  ER_UNLOCK;.    p
c920: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
c930: 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 0;.  }.}../*
c940: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c950: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
c960: 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52  ed when an IOERR
c970: 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c  , CORRUPT or FUL
c980: 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68  L error.** may h
c990: 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68  ave occurred. Th
c9a0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
c9b0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c9c0: 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73   the pager .** s
c9d0: 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
c9e0: 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63  cond the error-c
c9f0: 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
ca00: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
ca10: 67 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63  ger .** API func
ca20: 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20  tion. The value 
ca30: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
ca40: 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
ca50: 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f   argument .** to
ca60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
ca70: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
ca80: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
ca90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
caa0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
cab0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a  r SQLITE_FULL.**
cac0: 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d   the error becom
cad0: 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55  es persistent. U
cae0: 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74  ntil the persist
caf0: 65 6e 74 20 65 72 72 6f 72 20 69 73 20 63 6c 65  ent error is cle
cb00: 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75  ared,.** subsequ
cb10: 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e  ent API calls on
cb20: 20 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c   this Pager will
cb30: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
cb40: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  urn the same .**
cb50: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
cb60: 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20  ** A persistent 
cb70: 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20  error indicates 
cb80: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
cb90: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
cba0: 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
cbb0: 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
cbc0: 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
cbd0: 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
cbe0: 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
cbf0: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
cc00: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
cc10: 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
cc20: 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
cc30: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
cc40: 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
cc50: 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
cc60: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
cc70: 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
cc80: 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
cc90: 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
cca0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
ccb0: 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
ccc0: 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
ccd0: 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
cce0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
ccf0: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
cd00: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
cd10: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
cd20: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
cd30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
cd40: 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
cd50: 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
cd60: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
cd70: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
cd80: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
cd90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
cda0: 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
cdb0: 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
cdc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
cdd0: 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
cde0: 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
cdf0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
ce00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
ce10: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20  Code = rc;.  }. 
ce20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ce30: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
ce40: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
ce50: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
ce60: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
ce70: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
ce80: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
ce90: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
cea0: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
ceb0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
cec0: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
ced0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
cee0: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
cef0: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
cf00: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
cf10: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
cf20: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
cf30: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
cf40: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
cf50: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
cf60: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
cf70: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
cf80: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
cf90: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
cfa0: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
cfb0: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
cfc0: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
cfd0: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
cfe0: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
cff0: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
d000: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
d010: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
d020: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
d030: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
d040: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
d050: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
d060: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
d070: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
d080: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
d090: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
d0a0: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
d0b0: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
d0c0: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
d0d0: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
d0e0: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
d0f0: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
d100: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
d110: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
d120: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
d130: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
d140: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
d150: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
d160: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
d170: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
d180: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
d190: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
d1a0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
d1b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
d1c0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
d1d0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
d1e0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
d1f0: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
d200: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
d210: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
d220: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
d230: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
d240: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
d250: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
d260: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
d270: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
d280: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
d290: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
d2a0: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
d2b0: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
d2c0: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
d2d0: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
d2e0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
d2f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
d300: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
d310: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d320: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
d330: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
d340: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
d350: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
d360: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
d370: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
d380: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
d390: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
d3a0: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
d3b0: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
d3c0: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
d3d0: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
d3e0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
d3f0: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
d400: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
d410: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
d420: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
d430: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
d440: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
d450: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
d460: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
d470: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
d480: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
d490: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
d4a0: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
d4b0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
d4c0: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
d4d0: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
d4e0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
d4f0: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
d500: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
d510: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
d520: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
d530: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
d540: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
d550: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
d560: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
d570: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
d580: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
d590: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
d5a0: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
d5b0: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
d5c0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
d5d0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
d5e0: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
d5f0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
d600: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
d610: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
d620: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
d630: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
d640: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
d650: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
d660: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
d670: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
d680: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
d690: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
d6a0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
d6b0: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
d6c0: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
d6d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d6e0: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
d6f0: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
d700: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
d710: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
d720: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
d730: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
d740: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
d750: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
d760: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
d770: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
d780: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
d790: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
d7a0: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
d7b0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
d7c0: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
d7d0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
d7e0: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
d7f0: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
d800: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
d810: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d820: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
d830: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
d840: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d850: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
d860: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
d870: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
d880: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
d890: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
d8a0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
d8b0: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
d8c0: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
d8d0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
d8e0: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
d8f0: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
d900: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
d910: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
d920: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
d930: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
d940: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
d950: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
d960: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
d970: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
d980: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
d990: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
d9a0: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
d9b0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
d9c0: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
d9d0: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
d9e0: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
d9f0: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
da00: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
da10: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
da20: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
da30: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
da40: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
da50: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
da60: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
da70: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
da80: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
da90: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
daa0: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
dab0: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
dac0: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
dad0: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
dae0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
daf0: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
db00: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
db10: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
db20: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
db30: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
db40: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
db50: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
db60: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
db70: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
db80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
db90: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
dba0: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
dbb0: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
dbc0: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
dbd0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
dbe0: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
dbf0: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
dc00: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
dc10: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
dc20: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
dc30: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
dc40: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
dc50: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
dc60: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
dc70: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
dc80: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
dc90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
dca0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
dcb0: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
dcc0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
dcd0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
dce0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
dcf0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
dd00: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
dd10: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
dd20: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
dd30: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
dd40: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
dd50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dd60: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
dd70: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
dd80: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
dd90: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
dda0: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
ddb0: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
ddc0: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
ddd0: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
dde0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
ddf0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
de00: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
de10: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
de20: 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
de30: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
de40: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
de50: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
de60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
de70: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
de80: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
de90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
dea0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
deb0: 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
dec0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
ded0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
dee0: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
def0: 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
df00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
df10: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
df20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
df30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
df40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df50: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
df60: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
df70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
df80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
df90: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
dfa0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
dfb0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
dfc0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
dfd0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
dfe0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
dff0: 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ST.      || (pPa
e000: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
e010: 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  de && pPager->jo
e020: 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
e030: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
e040: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
e050: 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  c = zeroJournalH
e060: 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61  dr(pPager, hasMa
e070: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67  ster);.      pag
e080: 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
e090: 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67   rc);.      pPag
e0a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
e0b0: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
e0c0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
e0d0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
e0e0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
e0f0: 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65  ranch may be exe
e100: 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72  cuted with Pager
e110: 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45  .journalMode==ME
e120: 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a  MORY if.      **
e130: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
e140: 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62  as just rolled b
e150: 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
e160: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  e the journal.  
e170: 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75      ** file shou
e180: 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ld be closed and
e190: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69   deleted. If thi
e1a0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
e1b0: 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  tes to.      ** 
e1c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e1d0: 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f  e, it will do so
e1e0: 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d   using an in-mem
e1f0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20  ory journal. .  
e200: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
e210: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
e220: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
e230: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
e240: 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  TE .           |
e250: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
e260: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e270: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
e280: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
e290: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
e2a0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
e2b0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
e2c0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
e2d0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
e2e0: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
e2f0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
e300: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
e310: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
e320: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
e330: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
e340: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
e350: 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
e360: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
e370: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
e380: 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
e390: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
e3a0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
e3b0: 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  h);.#endif.  }. 
e3c0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
e3d0: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
e3e0: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
e3f0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
e400: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
e410: 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Rec = 0;.  sqlit
e420: 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
e430: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
e440: 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
e450: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
e460: 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
e470: 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61  e3WalEndWriteTra
e480: 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
e490: 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65  >pWal);.    asse
e4a0: 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  rt( rc2==SQLITE_
e4b0: 4f 4b 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OK );.    pPager
e4c0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
e4d0: 53 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20  SHARED;..    /* 
e4e0: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
e4f0: 6e 20 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67  n was in locking
e500: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
e510: 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c  mode but is no l
e520: 6f 6e 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72  onger,.    ** dr
e530: 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  op the EXCLUSIVE
e540: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
e550: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
e560: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e570: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
e580: 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65  veMode && sqlite
e590: 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
e5a0: 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
e5b0: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20  0) ){.      rc2 
e5c0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
e5d0: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
e5e0: 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  CK);.    }.  }el
e5f0: 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
e600: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
e610: 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
e620: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
e630: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
e640: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e650: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
e660: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
e670: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
e680: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
e690: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
e6a0: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
e6b0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e6c0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
e6d0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
e6e0: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
e6f0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
e700: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e710: 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a  dbModified = 0;.
e720: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74  .  /* TODO: Is t
e730: 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79  his optimal? Why
e740: 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20   is the db size 
e750: 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65  invalidated here
e760: 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20   .  ** when the 
e770: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
e780: 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a   not unlocked? *
e790: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  /.  pPager->dbOr
e7a0: 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71  igSize = 0;.  sq
e7b0: 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
e7c0: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
e7d0: 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
e7e0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d  ize);.  if( !MEM
e7f0: 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
e800: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
e810: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
e820: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
e830: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
e840: 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
e850: 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
e860: 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
e870: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
e880: 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
e890: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
e8a0: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
e8b0: 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
e8c0: 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
e8d0: 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
e8e0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
e8f0: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
e900: 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
e910: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
e920: 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
e930: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
e940: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
e950: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
e960: 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
e970: 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
e980: 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
e990: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
e9a0: 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
e9b0: 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
e9c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
e9d0: 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
e9e0: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
e9f0: 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
ea00: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
ea10: 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
ea20: 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
ea30: 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
ea40: 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
ea50: 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
ea60: 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
ea70: 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
ea80: 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
ea90: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
eaa0: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
eab0: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
eac0: 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
ead0: 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
eae0: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
eaf0: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
eb00: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
eb10: 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
eb20: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
eb30: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
eb40: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
eb50: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
eb60: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
eb70: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
eb80: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
eb90: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
eba0: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
ebb0: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
ebc0: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
ebd0: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
ebe0: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
ebf0: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
ec00: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
ec10: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
ec20: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
ec30: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
ec40: 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
ec50: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
ec60: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
ec70: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
ec80: 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
ec90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
eca0: 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
ecb0: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
ecc0: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
ecd0: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
ece0: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
ecf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
ed00: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
ed10: 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
ed20: 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
ed30: 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
ed40: 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
ed50: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
ed60: 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
ed70: 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
ed80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ed90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
eda0: 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
edb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
edc0: 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
edd0: 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
ede0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee00: 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
ee10: 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
ee20: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
ee30: 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
ee40: 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
ee50: 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
ee60: 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
ee70: 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c */.#endif../*.
ee80: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
ee90: 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
eea0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
eeb0: 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
eec0: 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
eed0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
eee0: 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
eef0: 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
ef00: 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
ef10: 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
ef20: 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
ef30: 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
ef40: 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
ef50: 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
ef60: 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
ef70: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
ef80: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
ef90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61  ..**.** The isMa
efa0: 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74  inJrnl flag is t
efb0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74  rue if this is t
efc0: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
efd0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
efe0: 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74  false for the st
eff0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
f000: 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62    The main rollb
f010: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
f020: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  .** checksums - 
f030: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
f040: 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a  urnal does not..
f050: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
f060: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
f070: 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
f080: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
f090: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
f0a0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
f0b0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
f0c0: 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
f0d0: 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
f0e0: 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
f0f0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
f100: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
f110: 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
f120: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
f130: 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
f140: 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
f150: 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
f160: 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
f170: 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
f180: 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
f190: 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
f1a0: 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
f1b0: 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
f1c0: 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
f1d0: 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
f1e0: 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
f1f0: 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
f200: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
f210: 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
f220: 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
f230: 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
f240: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
f250: 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
f260: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
f270: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
f280: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
f290: 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
f2a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
f2b0: 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
f2c0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
f2d0: 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
f2e0: 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
f2f0: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
f300: 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
f310: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
f320: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
f330: 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
f340: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
f350: 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
f360: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
f370: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
f380: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
f390: 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
f3a0: 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
f3b0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
f3c0: 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
f3d0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
f3e0: 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
f3f0: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
f400: 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
f410: 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
f420: 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
f430: 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
f440: 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
f450: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
f460: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
f470: 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
f480: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
f490: 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
f4a0: 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
f4b0: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
f4c0: 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
f4d0: 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
f4e0: 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
f4f0: 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
f500: 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
f510: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
f520: 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
f530: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
f540: 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
f550: 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
f560: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
f570: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
f580: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
f590: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
f5a0: 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
f5b0: 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
f5c0: 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
f5d0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
f5e0: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
f5f0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
f600: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f620: 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
f630: 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
f640: 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20  i64 *pOffset,   
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f660: 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72   Offset of recor
f670: 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f  d to playback */
f680: 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
f690: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f6a0: 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
f6b0: 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
f6c0: 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
f6d0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
f6e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
f6f0: 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
f700: 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
f710: 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  l. */.  int isSa
f720: 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20  vepnt           
f730: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
f740: 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
f750: 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  llback */.){.  i
f760: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
f770: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
f780: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
f790: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
f7a0: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
f7b0: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
f7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f7d0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
f7e0: 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
f7f0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
f800: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
f810: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
f820: 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
f830: 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
f840: 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20  char *aData;    
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f860: 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   Temporary stora
f870: 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ge for the page 
f880: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
f890: 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  e *jfd;         
f8a0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
f8b0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
f8c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
f8d0: 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64  /.  int isSynced
f8e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f8f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
f900: 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e  rnal page is syn
f910: 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ced */..  assert
f920: 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31  ( (isMainJrnl&~1
f930: 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  )==0 );      /* 
f940: 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20  isMainJrnl is 0 
f950: 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
f960: 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29  ( (isSavepnt&~1)
f970: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  ==0 );       /* 
f980: 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f  isSavepnt is 0 o
f990: 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
f9a0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70   isMainJrnl || p
f9b0: 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70  Done );     /* p
f9c0: 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64  Done always used
f9d0: 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73   on sub-journals
f9e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
f9f0: 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65  Savepnt || pDone
fa00: 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e  ==0 );   /* pDon
fa10: 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20  e never used on 
fa20: 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f  non-savepoint */
fa30: 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67  ..  aData = pPag
fa40: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
fa50: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
fa60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
fa70: 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
fa80: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
fa90: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
faa0: 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
fab0: 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
fac0: 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  | (!isMainJrnl &
fad0: 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a  & isSavepnt) );.
fae0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
faf0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
fb00: 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
fb10: 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
fb20: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
fb30: 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
fb40: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
fb50: 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
fb60: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
fb70: 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
fb80: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
fb90: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
fba0: 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
fbb0: 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
fbc0: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
fbd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
fbe0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
fbf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
fc00: 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61  ad(jfd, (u8*)aDa
fc10: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
fc20: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
fc30: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
fc40: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
fc50: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
fc60: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
fc70: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
fc80: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
fc90: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
fca0: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
fcb0: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
fcc0: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
fcd0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
fce0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
fcf0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
fd00: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
fd10: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
fd20: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
fd30: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
fd40: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
fd50: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
fd60: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
fd70: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
fd80: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
fd90: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
fda0: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
fdb0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
fdc0: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
fdd0: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
fde0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
fdf0: 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
fe00: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
fe10: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
fe20: 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
fe30: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
fe40: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
fe50: 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
fe60: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
fe70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
fe80: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
fe90: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
fea0: 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
feb0: 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
fec0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
fed0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
fee0: 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
fef0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
ff00: 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ger, (u8*)aData)
ff10: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
ff20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
ff30: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
ff40: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
ff50: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
ff60: 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65 66  en played by bef
ff70: 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ore during the c
ff80: 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  urrent.  ** roll
ff90: 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74  back, then don't
ffa0: 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20   bother to play 
ffb0: 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20  it back again.. 
ffc0: 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   */.  if( pDone 
ffd0: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
ffe0: 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
fff0: 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
10000 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
10010 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
10020 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
10030 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
10040 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
10050 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
10060 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  VE );..  /* When
10070 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
10080 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
10090 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
100a0 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
100b0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
100c0 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
100d0 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
100e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
100f0 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
10100 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
10110 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
10120 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
10130 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
10140 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
10150 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
10160 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
10170 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
10180 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
10190 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
101a0 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
101b0 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
101c0 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
101d0 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
101e0 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
101f0 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
10200 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
10210 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
10220 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
10230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
10240 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
10250 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
10260 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
10270 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
10280 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
10290 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
102a0 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
102b0 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
102c0 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
102d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
102e0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
102f0 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
10300 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
10310 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
10320 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
10330 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
10340 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
10350 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
10360 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
10370 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
10380 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
10390 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
103a0 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
103b0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
103c0 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
103d0 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
103e0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
103f0 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
10400 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
10410 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
10420 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
10430 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
10440 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
10450 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
10460 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
10470 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
10480 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
10490 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
104a0 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
104b0 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
104c0 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
104d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
104e0 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
104f0 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
10500 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
10510 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
10520 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
10530 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
10540 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
10550 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
10560 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
10570 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
10580 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
10590 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
105a0 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
105b0 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
105c0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
105d0 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
105e0 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
105f0 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
10600 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
10610 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
10620 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
10630 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
10640 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
10650 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
10660 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
10670 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
10680 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
10690 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
106a0 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
106b0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
106c0 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
106d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
106e0 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
106f0 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
10700 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
10710 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
10720 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
10730 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
10740 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
10750 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
10760 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
10770 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
10780 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
10790 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
107a0 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
107b0 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
107c0 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
107d0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
107e0 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
107f0 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
10800 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
10810 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
10820 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
10830 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
10840 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
10850 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
10860 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
10870 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
10880 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  */.  if( pagerUs
10890 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
108a0 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d      pPg = 0;.  }
108b0 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20  else{.    pPg = 
108c0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
108d0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
108e0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
108f0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47   !MEMDB );.  PAG
10900 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
10910 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
10920 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
10930 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
10940 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
10950 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
10960 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
10970 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a  e, (u8*)aData),.
10980 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
10990 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
109a0 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
109b0 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
109c0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
109d0 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50     isSynced = pP
109e0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
109f0 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61  (*pOffset <= pPa
10a00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
10a10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
10a20 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d  sSynced = (pPg==
10a30 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
10a40 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
10a50 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69  _SYNC));.  }.  i
10a60 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  f( (pPager->stat
10a70 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
10a80 56 45 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e  VE).   && isOpen
10a90 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
10aa0 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
10ab0 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
10ac0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
10ad0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
10ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
10af0 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
10b00 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
10b10 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
10b20 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
10b30 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
10b40 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
10b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
10b60 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
10b70 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
10b80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
10b90 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
10ba0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
10bb0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
10bc0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
10bd0 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
10be0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10bf0 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
10c00 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
10c10 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
10c20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
10c30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
10c40 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
10c50 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
10c60 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
10c70 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
10c80 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
10c90 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
10ca0 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
10cb0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
10cc0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
10cd0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
10ce0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
10cf0 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
10d00 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
10d10 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
10d20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
10d30 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
10d40 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
10d50 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
10d60 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
10d70 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
10d80 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
10d90 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
10da0 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
10db0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
10dc0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
10dd0 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
10de0 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
10df0 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
10e00 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
10e10 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
10e20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
10e30 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
10e40 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
10e50 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
10e60 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
10e70 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
10e80 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
10e90 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
10ea0 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
10eb0 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
10ec0 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
10ed0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
10ee0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
10ef0 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
10f00 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
10f10 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
10f20 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
10f30 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
10f40 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
10f50 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
10f60 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
10f70 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
10f80 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
10f90 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
10fa0 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
10fb0 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
10fc0 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
10fd0 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
10fe0 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
10ff0 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
11000 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
11010 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
11020 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
11030 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
11040 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11050 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
11060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11070 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29  >doNotSpill==0 )
11080 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
11090 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20  NotSpill++;.    
110a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
110b0 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
110c0 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
110d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
110e0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d  ger->doNotSpill=
110f0 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
11100 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a  ->doNotSpill--;.
11110 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11120 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
11130 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
11140 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
11150 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
11160 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
11170 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
11180 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
11190 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
111a0 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
111b0 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
111c0 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
111d0 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
111e0 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
111f0 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
11200 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
11210 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
11220 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
11230 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
11240 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
11250 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
11260 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
11270 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
11280 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
11290 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
112a0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
112b0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
112c0 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
112d0 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
112e0 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
112f0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
11300 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
11310 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
11320 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
11330 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
11340 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
11350 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
11360 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
11370 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
11380 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
11390 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
113a0 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
113b0 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
113c0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
113d0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
113e0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
113f0 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
11400 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
11410 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
11420 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
11430 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
11440 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
11450 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
11460 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
11470 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
11480 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
11490 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
114a0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
114b0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
114c0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
114d0 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
114e0 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
114f0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
11500 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
11510 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
11520 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
11530 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
11540 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
11550 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
11560 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
11570 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
11580 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
11590 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
115a0 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
115b0 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
115c0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
115d0 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
115e0 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
115f0 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
11600 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
11610 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
11620 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
11630 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
11640 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
11650 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
11660 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
11670 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
11680 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
11690 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
116a0 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
116b0 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
116c0 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
116d0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
116e0 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
116f0 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
11700 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
11710 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
11720 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
11730 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
11740 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
11750 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
11760 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
11770 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
11780 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
11790 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
117a0 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
117b0 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
117c0 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
117d0 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
117e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
117f0 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
11800 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
11810 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
11820 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
11830 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
11840 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
11850 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  Pg);.    }.#ifde
11860 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
11870 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
11880 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
11890 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
118a0 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
118b0 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
118c0 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
118d0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
118e0 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
118f0 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
11900 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
11910 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
11920 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
11930 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
11940 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
11950 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
11960 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
11970 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
11980 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
11990 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
119a0 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
119b0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
119c0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
119d0 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
119e0 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
119f0 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
11a00 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
11a10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
11a20 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
11a30 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
11a40 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
11a50 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
11a60 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
11a70 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
11a80 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11a90 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
11aa0 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
11ab0 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
11ac0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
11ad0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
11ae0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
11af0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
11b00 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
11b10 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
11b20 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
11b30 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
11b40 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
11b50 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
11b60 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
11b70 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
11b80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
11b90 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
11ba0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11bb0 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
11bc0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
11bd0 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
11be0 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
11bf0 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
11c00 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
11c10 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
11c20 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
11c30 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
11c40 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
11c50 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
11c60 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
11c70 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
11c80 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
11c90 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
11ca0 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
11cb0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
11cc0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
11cd0 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
11ce0 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
11cf0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
11d00 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
11d10 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
11d20 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
11d30 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
11d40 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11d50 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
11d60 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
11d70 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
11d80 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
11d90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
11da0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11db0 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
11dc0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
11dd0 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
11de0 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
11df0 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
11e00 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
11e10 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
11e20 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
11e30 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
11e40 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
11e50 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
11e60 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
11e70 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
11e80 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
11e90 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
11ea0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
11eb0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11ec0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
11ed0 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
11ee0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
11ef0 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
11f00 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
11f10 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
11f20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
11f30 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
11f40 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
11f50 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
11f60 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
11f70 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
11f80 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
11f90 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
11fa0 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
11fb0 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
11fc0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11fd0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
11fe0 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
11ff0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
12000 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
12010 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
12020 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
12030 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
12040 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
12050 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
12060 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
12070 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
12080 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
12090 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
120a0 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
120b0 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
120c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
120d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
120e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
120f0 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
12100 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
12110 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
12120 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
12130 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
12140 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
12150 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
12160 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
12170 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
12180 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
12190 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
121a0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
121b0 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
121c0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
121d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
121e0 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
121f0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
12200 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
12210 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12220 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
12230 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
12240 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
12250 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
12260 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
12270 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12280 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
12290 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
122a0 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
122b0 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
122c0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
122d0 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
122e0 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
122f0 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
12300 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
12310 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
12320 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
12330 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
12340 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
12350 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
12360 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12370 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
12380 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
12390 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
123a0 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
123b0 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
123c0 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
123d0 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
123e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
123f0 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
12400 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
12410 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
12420 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
12430 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
12440 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
12450 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
12460 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
12470 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
12480 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
12490 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
124a0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
124b0 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
124c0 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
124d0 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
124e0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
124f0 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
12500 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
12510 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
12520 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
12530 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
12540 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
12550 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12560 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
12570 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
12580 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
12590 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
125a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
125b0 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
125c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
125d0 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
125e0 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
125f0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
12600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12610 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
12620 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ut;..  /* Load t
12630 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
12640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
12650 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
12660 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  d from.  ** sqli
12670 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
12680 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
12690 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20  MasterJournal.  
126a0 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a   Also obtain.  *
126b0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  * sufficient spa
126c0 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74  ce (in zMasterPt
126d0 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  r) to hold the n
126e0 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20  ames of master. 
126f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
12700 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
12710 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63   regular rollbac
12720 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  k-journals..  */
12730 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
12740 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
12750 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
12760 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
12770 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
12780 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
12790 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
127a0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
127b0 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
127c0 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
127d0 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  oc((int)nMasterJ
127e0 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
127f0 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20  Ptr + 1);.  if( 
12800 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
12810 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12820 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
12830 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
12840 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50  ;.  }.  zMasterP
12850 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
12860 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
12870 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73  nal+1];.  rc = s
12880 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
12890 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
128a0 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74  rnal, (int)nMast
128b0 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
128c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
128d0 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
128e0 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74  ter_out;.  zMast
128f0 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
12900 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a  rJournal] = 0;..
12910 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
12920 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77  sterJournal;.  w
12930 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
12940 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
12950 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
12960 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73  {.    int exists
12970 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12980 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
12990 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
129a0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
129b0 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69   &exists);.    i
129c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
129d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64   ){.      goto d
129e0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
129f0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73    }.    if( exis
12a00 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ts ){.      /* O
12a10 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
12a20 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
12a30 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12a40 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
12a50 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
12a60 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
12a70 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
12a80 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
12a90 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
12aa0 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
12ab0 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
12ac0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
12ad0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63    */.      int c
12ae0 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
12af0 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
12b00 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
12b10 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
12b20 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  AL);.      rc = 
12b30 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
12b40 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
12b50 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
12b60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
12b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12b80 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
12b90 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
12ba0 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  }..      rc = re
12bb0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
12bc0 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
12bd0 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
12be0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12bf0 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
12c00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
12c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12c20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
12c30 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
12c40 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  }..      c = zMa
12c50 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
12c60 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
12c70 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
12c80 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a  .      if( c ){.
12c90 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
12ca0 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
12cb0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
12cc0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12cd0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  e. */.        go
12ce0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
12cf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12d00 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
12d10 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
12d20 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
12d30 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73   }. .  sqlite3Os
12d40 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
12d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12d60 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
12d70 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
12d80 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  ster_out:.  sqli
12d90 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
12da0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
12db0 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
12dc0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
12dd0 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
12de0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
12df0 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c  rnal) );.    sql
12e00 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
12e10 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
12e20 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
12e30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12e40 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
12e50 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
12e60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
12e70 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
12e80 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
12e90 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
12ea0 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
12eb0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
12ec0 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
12ed0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
12ee0 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
12ef0 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
12f00 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
12f10 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
12f20 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
12f30 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  n, or an exclusi
12f40 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a  ve lock is not.*
12f50 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  * held, this fun
12f60 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
12f70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
12f80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
12f90 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20  e is.** changed 
12fa0 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
12fb0 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
12fc0 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49  geSize bytes). I
12fd0 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e  f the file.** on
12fe0 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
12ff0 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
13000 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
13010 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
13020 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
13030 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
13040 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
13050 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  might might be t
13060 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
13070 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
13080 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
13090 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
130a0 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
130b0 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
130c0 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
130d0 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
130e0 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
130f0 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
13100 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
13110 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
13120 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
13130 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
13140 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
13150 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
13160 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
13170 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
13180 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
13190 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
131a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
131b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
131c0 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
131d0 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
131e0 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
131f0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
13200 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
13210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
13220 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
13230 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
13240 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
13250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13260 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
13270 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
13280 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  VE && isOpen(pPa
13290 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
132a0 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
132b0 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a   newSize;.    /*
132c0 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66   TODO: Is it saf
132d0 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64  e to use Pager.d
132e0 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20  bFileSize here? 
132f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
13300 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
13310 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
13320 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
13330 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
13340 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61  ageSize*(i64)nPa
13350 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
13360 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
13370 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
13380 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
13390 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
133a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
133b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
133c0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
133d0 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
133e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
133f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
13400 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
13410 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31  "", 1, newSize-1
13420 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13430 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
13450 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
13460 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
13470 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
13480 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13490 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
134a0 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63  of the Pager.sec
134b0 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
134c0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
134d0 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e  * pager based on
134e0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
134f0 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
13500 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a  orSize method.**
13510 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74   of the open dat
13520 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
13530 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
13540 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a   be used used .*
13550 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  * to determine t
13560 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67  he size and alig
13570 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  nment of journal
13580 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20   header and .** 
13590 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
135a0 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63  ointers within c
135b0 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  reated journal f
135c0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iles..**.** For 
135d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
135e0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
135f0 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77  ctor size is alw
13600 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a  ays 512 bytes..*
13610 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
13620 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72  for non-temporar
13630 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66  y files, the eff
13640 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
13650 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c  ze is.** the val
13660 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
13670 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29  he xSectorSize()
13680 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20   method rounded 
13690 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69  up to 32 if.** i
136a0 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33  t is less than 3
136b0 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f  2, or rounded do
136c0 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52  wn to MAX_SECTOR
136d0 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69  _SIZE if it.** i
136e0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d  s greater than M
136f0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
13700 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
13710 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
13720 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
13730 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
13740 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
13750 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
13760 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
13770 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
13780 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
13790 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
137a0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
137b0 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
137c0 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
137d0 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
137e0 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68  ed yet, in which
137f0 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
13800 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
13810 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
13820 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
13830 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
13840 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
13850 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
13860 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
13870 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
13880 65 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67  e<32 ){.    pPag
13890 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
138a0 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20   512;.  }.  if( 
138b0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
138c0 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
138d0 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE ){.    assert
138e0 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  ( MAX_SECTOR_SIZ
138f0 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50  E>=512 );.    pP
13900 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
13910 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
13920 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ZE;.  }.}../*.**
13930 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
13940 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
13950 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
13960 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
13970 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
13980 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
13990 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
139a0 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
139b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
139c0 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
139d0 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
139e0 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
139f0 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
13a00 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
13a10 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
13a20 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
13a30 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
13a40 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
13a50 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
13a60 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
13a70 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
13a80 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
13a90 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
13aa0 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
13ab0 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
13ac0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
13ad0 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
13ae0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
13af0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
13b00 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
13b10 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
13b20 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
13b30 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
13b40 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
13b50 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
13b60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
13b70 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
13b80 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
13b90 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
13ba0 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
13bb0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
13bc0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
13bd0 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
13be0 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
13bf0 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
13c00 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
13c10 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
13c20 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
13c30 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
13c40 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
13c50 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64  *  (7)  zero pad
13c60 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20  ding out to the 
13c70 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65  next sector size
13c80 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20  ..**  (8)  Zero 
13c90 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
13ca0 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
13cb0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
13cc0 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
13cd0 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
13ce0 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
13cf0 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
13d00 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
13d10 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
13d20 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
13d30 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
13d40 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
13d50 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
13d60 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 7 items above.
13d70 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
13d80 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
13d90 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
13da0 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 8th item..**
13db0 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
13dc0 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
13dd0 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
13de0 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
13df0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
13e00 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
13e10 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
13e20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
13e30 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
13e40 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
13e50 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
13e60 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
13e70 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
13e80 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
13e90 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
13ea0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
13eb0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
13ec0 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
13ed0 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
13ee0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
13ef0 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
13f00 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
13f10 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
13f20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
13f30 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
13f40 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
13f50 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
13f60 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
13f70 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
13f80 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
13f90 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
13fa0 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
13fb0 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
13fc0 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
13fd0 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
13fe0 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
13ff0 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
14000 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
14010 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
14020 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
14030 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
14040 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
14050 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
14060 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
14070 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
14080 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
14090 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
140a0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
140b0 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
140c0 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
140d0 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
140e0 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
140f0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
14100 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
14110 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
14120 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
14130 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
14140 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
14150 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
14160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14170 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
14180 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
14190 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
141a0 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
141b0 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
141c0 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
141d0 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
141e0 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
141f0 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
14200 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
14210 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
14220 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
14230 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
14240 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
14250 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
14260 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
14270 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
14280 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
14290 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
142a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
142b0 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
142c0 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
142d0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
142e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
142f0 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
14300 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
14310 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
14320 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
14330 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
14340 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
14350 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
14360 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
14370 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
14380 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
14390 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
143a0 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
143b0 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
143c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
143d0 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
143e0 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
143f0 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
14400 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
14410 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
14420 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
14430 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
14440 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
14450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14460 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
14470 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
14480 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
14490 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
144a0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
144b0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
144c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
144d0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
144e0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
144f0 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
14500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14510 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
14520 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
14530 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14550 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
14560 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
14570 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
14580 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
14590 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
145a0 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
145b0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
145c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
145d0 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
145e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
145f0 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
14600 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
14610 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
14620 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
14630 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
14640 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
14650 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
14660 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
14670 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
14680 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
14690 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
146a0 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
146b0 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
146c0 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  k */..  /* Figur
146d0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
146e0 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
146f0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
14700 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
14710 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
14720 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
14730 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
14740 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
14750 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
14760 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
14770 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
14780 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
14790 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  szJ==0 ){.    go
147a0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
147b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
147c0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
147d0 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
147e0 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
147f0 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
14800 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
14810 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
14820 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
14830 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
14840 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
14850 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
14860 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
14870 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
14880 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
14890 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
148a0 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
148b0 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
148c0 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
148d0 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
148e0 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
148f0 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
14900 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
14910 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
14920 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
14930 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
14940 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
14950 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
14960 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
14970 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
14980 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20    mxPathname is 
14990 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
149a0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
149b0 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
149c0 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
149d0 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
149e0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
149f0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
14a00 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
14a10 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
14a20 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
14a30 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
14a40 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
14a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14a60 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
14a70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14a80 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
14a90 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
14aa0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
14ab0 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
14ac0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
14ad0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
14ae0 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
14af0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
14b00 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14b10 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
14b20 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
14b30 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
14b40 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
14b50 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
14b60 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
14b70 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
14b80 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
14b90 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
14ba0 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
14bb0 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
14bc0 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
14bd0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f  hile( 1 ){.    /
14be0 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
14bf0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
14c00 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
14c10 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
14c20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
14c30 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
14c40 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
14c50 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
14c60 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
14c70 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
14c80 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
14c90 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
14ca0 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
14cb0 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
14cc0 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
14cd0 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
14ce0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
14cf0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
14d00 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
14d10 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c  r(pPager, isHot,
14d20 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
14d30 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
14d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
14d50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14d60 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
14d70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14d80 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
14d90 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
14da0 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
14db0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
14dc0 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
14dd0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
14de0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
14df0 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
14e00 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
14e10 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
14e20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
14e30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
14e40 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
14e50 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
14e60 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
14e70 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
14e80 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
14e90 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
14ea0 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
14eb0 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
14ec0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
14ed0 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
14ee0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
14ef0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
14f00 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
14f10 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
14f20 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
14f30 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
14f40 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
14f50 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
14f60 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
14f70 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
14f80 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
14f90 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
14fa0 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
14fb0 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
14fc0 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
14fd0 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
14fe0 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
14ff0 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
15000 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
15010 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
15020 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
15030 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
15040 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
15050 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
15060 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
15070 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15080 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
15090 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
150a0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
150b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
150c0 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
150d0 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
150e0 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
150f0 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57   #2565..    ** W
15100 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
15110 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20   a hot journal, 
15120 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d  nRec==0 always m
15130 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
15140 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20  xt.    ** chunk 
15150 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  of the journal c
15160 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67  ontains zero pag
15170 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  es to be rolled 
15180 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  back.  But.    *
15190 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52  * when doing a R
151a0 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20  OLLBACK and the 
151b0 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73  nRec==0 chunk is
151c0 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20   the last chunk 
151d0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
151e0 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20  urnal, it means 
151f0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
15200 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
15210 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a  dditional.    **
15220 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
15230 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
15240 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
15250 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15260 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  .    ** should b
15270 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64  e computed based
15280 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
15290 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  file size..    *
152a0 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
152b0 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
152c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
152d0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
152e0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
152f0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
15300 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
15310 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
15320 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
15330 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
15340 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
15350 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
15360 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
15370 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
15380 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
15390 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
153a0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
153b0 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
153c0 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
153d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
153e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
153f0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
15400 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
15410 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
15420 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
15430 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
15440 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15450 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
15460 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
15470 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
15480 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
15490 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
154a0 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
154b0 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
154c0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
154d0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
154e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
154f0 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
15500 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
15510 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
15520 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
15530 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
15540 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
15550 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
15560 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
15570 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
15580 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
15590 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
155a0 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d  (pPager,&pPager-
155b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c  >journalOff,0,1,
155c0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
155d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
155e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
155f0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
15600 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
15610 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
15620 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15630 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
15640 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15650 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
15660 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
15670 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
15680 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
15690 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
156a0 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
156b0 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
156c0 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
156d0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
156e0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
156f0 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
15700 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
15710 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
15720 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
15730 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
15740 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
15750 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
15760 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
15770 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
15780 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
15790 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
157a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
157b0 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
157c0 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
157d0 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
157e0 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
157f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
15800 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
15810 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
15820 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15830 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
15840 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
15850 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
15860 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
15870 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
15880 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
15890 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
158a0 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
158b0 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
158c0 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
158d0 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
158e0 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
158f0 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
15900 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
15910 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
15920 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
15930 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
15940 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
15950 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
15960 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
15970 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
15980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
15990 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
159a0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
159b0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
159c0 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
159d0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
159e0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
159f0 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
15a00 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
15a10 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
15a20 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
15a30 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
15a40 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
15a50 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
15a60 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
15a70 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
15a80 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
15a90 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
15aa0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15ab0 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
15ac0 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  fied..  */.  ass
15ad0 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d  ert(.    pPager-
15ae0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30  >fd->pMethods==0
15af0 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ||.    sqlite3O
15b00 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
15b10 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46  ger->fd,SQLITE_F
15b20 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
15b30 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a  D,0)>=SQLITE_OK.
15b40 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68    );..  /* If th
15b50 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
15b60 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
15b70 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
15b80 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
15b90 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
15ba0 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
15bb0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
15bc0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
15bd0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
15be0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
15bf0 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
15c00 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
15c10 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
15c20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
15c30 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
15c40 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
15c50 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
15c60 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
15c70 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
15c80 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
15c90 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
15ca0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
15cb0 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
15cc0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
15cd0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
15ce0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
15cf0 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
15d00 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
15d10 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
15d20 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
15d30 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
15d40 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
15d50 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
15d60 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
15d70 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
15d80 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
15d90 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
15da0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
15db0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
15dc0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
15dd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
15de0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
15df0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
15e00 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
15e10 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
15e20 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
15e30 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
15e40 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
15e50 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
15e60 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
15e70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15e80 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
15e90 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
15ea0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
15eb0 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72  CLUSIVE ){.    r
15ec0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
15ed0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
15ee0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
15ef0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
15f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
15f10 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
15f20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
15f30 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
15f40 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  E ){.    rc = sq
15f50 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
15f60 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
15f70 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d  sync_flags);.  }
15f80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15f90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
15fa0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
15fb0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
15fc0 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
15fd0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
15fe0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
15ff0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
16000 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
16010 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
16020 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
16030 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
16040 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
16050 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
16060 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
16070 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
16080 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
16090 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
160a0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
160b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
160c0 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
160d0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
160e0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
160f0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
16100 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
16110 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
16120 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
16130 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
16140 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
16150 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
16160 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
16170 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
16180 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
16190 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
161a0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
161b0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
161c0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
161d0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
161e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
161f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
16200 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
16210 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
16220 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16230 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
16240 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
16250 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
16260 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
16270 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
16280 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
16290 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
162a0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
162b0 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
162c0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
162d0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
162e0 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
162f0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
16300 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
16310 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
16320 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
16330 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
16340 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
16350 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
16360 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
16370 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
16380 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
16390 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
163a0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
163b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
163c0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
163d0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
163e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
163f0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
16400 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
16410 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
16420 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
16430 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
16440 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
16450 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16460 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57  e */.  int isInW
16470 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  al = 0;         
16480 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
16490 61 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69  age is in log fi
164a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a  le */.  int pgsz
164b0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
164c0 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ize; /* Number o
164d0 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20  f bytes to read 
164e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
164f0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
16500 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45  ER_SHARED && !ME
16510 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
16520 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
16530 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
16540 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
16550 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
16560 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16570 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
16580 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
16590 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
165a0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
165b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
165c0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
165d0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
165e0 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70  .    /* Try to p
165f0 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f  ull the page fro
16600 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  m the write-ahea
16610 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  d log. */.    rc
16620 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
16630 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  d(pPager->pWal, 
16640 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20  pgno, &isInWal, 
16650 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
16660 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
16670 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69  =SQLITE_OK && !i
16680 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36  sInWal ){.    i6
16690 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
166a0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
166b0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
166c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
166d0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
166e0 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
166f0 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
16700 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
16710 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
16720 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
16730 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
16740 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
16750 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
16760 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
16770 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
16780 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
16790 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
167a0 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
167b0 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
167c0 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
167d0 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
167e0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
167f0 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
16800 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
16810 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
16820 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
16830 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
16840 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
16850 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
16860 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
16870 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
16880 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
16890 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
168a0 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
168b0 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
168c0 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
168d0 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
168e0 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
168f0 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
16900 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
16910 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
16920 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
16930 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
16940 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
16950 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
16960 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
16970 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
16980 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
16990 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
169a0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
169b0 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
169c0 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36  sing equaling 16
169d0 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69   bytes of 0xff i
169e0 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  s vanishingly sm
169f0 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20  all so.      ** 
16a00 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  we should still 
16a10 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  be ok..      */.
16a20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
16a30 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
16a40 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50   0xff, sizeof(pP
16a50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
16a60 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
16a70 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56       u8 *dbFileV
16a80 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
16a90 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
16aa0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
16ab0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
16ac0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
16ad0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
16ae0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20  eVers));.    }. 
16af0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
16b00 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
16b10 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
16b20 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20  LITE_NOMEM);..  
16b30 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
16b40 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
16b50 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
16b60 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
16b70 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
16b80 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
16b90 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
16ba0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
16bb0 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
16bc0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
16be0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
16bf0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
16c00 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
16c10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
16c20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16c30 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
16c40 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
16c50 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
16c60 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
16c70 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
16c80 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
16c90 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
16ca0 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
16cb0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
16cc0 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
16cd0 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
16ce0 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
16cf0 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
16d00 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
16d10 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
16d20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
16d30 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
16d40 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
16d50 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
16d60 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
16d70 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
16d80 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
16d90 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
16da0 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
16db0 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
16dc0 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
16dd0 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
16de0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
16df0 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
16e00 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
16e10 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
16e20 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
16e30 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
16e40 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
16e50 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
16e60 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
16e70 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
16e80 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
16e90 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16ea0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
16eb0 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
16ec0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
16ed0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
16ee0 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
16ef0 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
16f00 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
16f10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
16f20 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
16f30 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
16f40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
16f50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
16f60 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
16f70 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
16f80 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
16f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
16fa0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
16fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
16fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16fd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
16fe0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
16ff0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17000 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
17010 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
17020 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  /* Normally, if 
17030 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
17040 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e   rolled back, an
17050 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  y backup process
17060 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61  es are.  ** upda
17070 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63  ted as data is c
17080 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
17090 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
170a0 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20  l and into the. 
170b0 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
170c0 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61  is is not genera
170d0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74  lly possible wit
170e0 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  h a WAL database
170f0 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  , as.  ** rollba
17100 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70  ck involves simp
17110 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  ly truncating th
17120 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72  e log file. Ther
17130 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20  efore, if one.  
17140 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65  ** or more frame
17150 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
17160 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
17170 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72  he log (and ther
17180 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f  efore .  ** also
17190 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
171a0 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65   backup database
171b0 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  s) as part of th
171c0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  is transaction,.
171d0 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73    ** the backups
171e0 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74   must be restart
171f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
17200 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
17210 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
17220 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
17230 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
17240 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
17250 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74   to rollback a t
17260 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20  ransaction on a 
17270 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  WAL database..*/
17280 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
17290 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67  rRollbackWal(Pag
172a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
172b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
172d0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
172e0 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b  .  PgHdr *pList;
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69     /* List of di
17310 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76  rty pages to rev
17320 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72  ert */..  /* For
17330 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
17340 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65  e cache that are
17350 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
17360 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79   or have already
17370 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  .  ** been writt
17380 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d  en (but not comm
17390 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f  itted) to the lo
173a0 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f  g file, do one o
173b0 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c  f the .  ** foll
173c0 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
173d0 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65     + Discard the
173e0 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66   cached page (if
173f0 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f   refcount==0), o
17400 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61  r.  **   + Reloa
17410 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66  d page content f
17420 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
17430 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29   (if refcount>0)
17440 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
17450 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
17460 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
17470 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55  rc = sqlite3WalU
17480 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
17490 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  , pagerUndoCallb
174a0 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  ack, (void *)pPa
174b0 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ger);.  pList = 
174c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
174d0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
174e0 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65  PCache);.  while
174f0 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53  ( pList && rc==S
17500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17510 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
17520 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
17530 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
17540 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a  Callback((void *
17550 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  )pPager, pList->
17560 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74  pgno);.    pList
17570 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20   = pNext;.  }.. 
17580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17590 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
175a0 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20  on is a wrapper 
175b0 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61  around sqlite3Wa
175c0 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65  lFrames(). As we
175d0 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a  ll as logging.**
175e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
175f0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
17600 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69  es headed by pLi
17610 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  st (connected by
17620 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69   pDirty),.** thi
17630 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66  s function notif
17640 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62  ies any active b
17650 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
17660 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68  that the pages h
17670 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20  ave.** changed. 
17680 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
17690 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a  pagerWalFrames(.
176a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
176b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176c0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
176d0 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  t */.  PgHdr *pL
176e0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
176f0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
17700 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20  f frames to log 
17710 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63  */.  Pgno nTrunc
17720 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
17730 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
17740 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73   size after this
17750 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
17760 20 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20   isCommit,      
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17780 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
17790 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e  a commit */.  in
177a0 74 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20  t sync_flags    
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
177c0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
177d0 6f 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30  o OsSync() (or 0
177e0 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
177f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
17810 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
17820 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
17830 57 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  Wal );.  rc = sq
17840 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70  lite3WalFrames(p
17850 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
17860 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
17870 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72  Size, pList, nTr
17880 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74  uncate, isCommit
17890 2c 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29  , sync_flags.  )
178a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
178b0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
178c0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
178d0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
178e0 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
178f0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
17900 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
17910 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
17920 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
17930 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
17940 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17950 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17960 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72   Begin a read tr
17970 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
17980 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   WAL..**.** This
17990 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f   routine used to
179a0 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65   be called "page
179b0 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22  rOpenSnapshot()"
179c0 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65   because it esse
179d0 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73  ntially.** makes
179e0 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74   a snapshot of t
179f0 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  he database at t
17a00 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74  he current point
17a10 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65   in time and pre
17a20 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73  serves.** that s
17a30 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20  napshot for use 
17a40 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e  by the reader in
17a50 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72   spite of concur
17a60 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62  rently changes b
17a70 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65  y.** other write
17a80 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  rs or checkpoint
17a90 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
17aa0 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  nt pagerBeginRea
17ab0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  dTransaction(Pag
17ac0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
17ad0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17af0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
17b00 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d  .  int changed =
17b10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17b20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
17b30 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65  che must be rese
17b40 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
17b50 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
17b60 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  er) );..  /* sql
17b70 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
17b80 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20  ansaction() was 
17b90 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  not called for t
17ba0 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a  he previous.  **
17bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
17bc0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
17bd0 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c  LUSIVE.  So call
17be0 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a   it now.  If we.
17bf0 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b    ** are in lock
17c00 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20  ing_mode=NORMAL 
17c10 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61  and EndRead() wa
17c20 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  s previously cal
17c30 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75  led,.  ** the du
17c40 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20  plicate call is 
17c50 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20  harmless..  */. 
17c60 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
17c70 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
17c80 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
17c90 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
17ca0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
17cb0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
17cc0 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69  , &changed);.  i
17cd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17ce0 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d   ){.    int dumm
17cf0 79 3b 0a 20 20 20 20 69 66 28 20 63 68 61 6e 67  y;.    if( chang
17d00 65 64 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  ed ){.      page
17d10 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
17d20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17d30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
17d40 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
17d50 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20  Valid==0 );.    
17d60 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
17d70 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
17d80 28 70 50 61 67 65 72 2c 20 26 64 75 6d 6d 79 29  (pPager, &dummy)
17d90 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
17da0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
17db0 41 52 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ARED;..  return 
17dc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
17dd0 63 6b 20 66 6f 72 20 74 68 65 20 65 78 69 73 74  ck for the exist
17de0 65 6e 63 65 20 6f 66 20 6f 72 20 64 65 6c 65 74  ence of or delet
17df0 65 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  e the *-wal file
17e00 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
17e10 73 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61  s to.** the data
17e20 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
17e30 50 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  Pager..**.** Whe
17e40 6e 20 70 45 78 69 73 74 73 21 3d 4e 55 4c 4c 2c  n pExists!=NULL,
17e50 20 73 65 74 20 2a 70 45 78 69 73 74 73 20 74 6f   set *pExists to
17e60 20 31 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20   1 if the *-wal 
17e70 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 72 20  file exists, or 
17e80 30 0a 2a 2a 20 69 66 20 74 68 65 20 2a 2d 77 61  0.** if the *-wa
17e90 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
17ea0 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  exist..**.** Whe
17eb0 6e 20 70 45 78 69 73 74 73 3d 3d 4e 55 4c 4c 2c  n pExists==NULL,
17ec0 20 64 65 6c 65 74 65 20 74 68 65 20 2a 2d 77 61   delete the *-wa
17ed0 6c 20 66 69 6c 65 20 69 66 20 69 74 20 65 78 69  l file if it exi
17ee0 73 74 73 2c 20 6f 72 20 74 68 65 20 64 6f 0a 2a  sts, or the do.*
17ef0 2a 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65  * nothing if the
17f00 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
17f10 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a   not exist..**.*
17f20 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
17f30 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 49  OK on success. I
17f40 66 20 6f 6e 20 61 6e 20 49 4f 20 6f 72 20 4f 4f  f on an IO or OO
17f50 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
17f60 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c  return.** an SQL
17f70 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
17f80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
17f90 67 65 72 43 68 65 63 6b 46 6f 72 4f 72 44 65 6c  gerCheckForOrDel
17fa0 65 74 65 57 41 4c 28 50 61 67 65 72 20 2a 70 50  eteWAL(Pager *pP
17fb0 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
17fc0 74 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ts){.  int rc;  
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
17ff0 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
18000 2a 7a 57 61 6c 20 3d 20 70 50 61 67 65 72 2d 3e  *zWal = pPager->
18010 7a 57 61 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 61  zWal;      /* Na
18020 6d 65 20 6f 66 20 74 68 65 20 57 41 4c 20 66 69  me of the WAL fi
18030 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
18040 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
18050 6c 65 20 29 3b 0a 20 20 69 66 28 20 70 45 78 69  le );.  if( pExi
18060 73 74 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sts ){.    rc = 
18070 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
18080 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 7a 57  pPager->pVfs, zW
18090 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
180a0 53 5f 45 58 49 53 54 53 2c 20 70 45 78 69 73 74  S_EXISTS, pExist
180b0 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
180c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
180d0 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
180e0 66 73 2c 20 7a 57 61 6c 2c 20 30 29 3b 0a 20 20  fs, zWal, 0);.  
180f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18100 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
18110 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
18120 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
18130 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18140 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
18150 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
18160 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
18170 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
18180 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
18190 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
181a0 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
181b0 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
181c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
181d0 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
181e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
181f0 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
18200 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
18210 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
18220 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
18230 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
18240 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
18250 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
18260 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
18270 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
18280 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
18290 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
182a0 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
182b0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
182c0 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
182d0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
182e0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
182f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
18300 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  WAL file is open
18310 65 64 2c 20 61 6c 73 6f 20 6f 70 65 6e 20 61 20  ed, also open a 
18320 73 6e 61 70 73 68 6f 74 20 28 72 65 61 64 20 74  snapshot (read t
18330 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
18340 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
18350 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
18360 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
18370 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
18380 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
18390 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
183a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
183b0 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
183c0 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
183d0 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
183e0 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
183f0 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
18400 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
18410 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
18420 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
18430 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
18440 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
18450 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
18460 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
18470 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
18480 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
18490 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
184a0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
184b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
184c0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
184d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
184e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c  ){.    int isWal
184f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18500 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
18510 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20  WAL file exists 
18520 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
18530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18540 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
18550 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18560 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
18570 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
18580 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
18590 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
185a0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
185b0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
185c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
185d0 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e  rn rc;.    if( n
185e0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
185f0 20 72 63 20 3d 20 70 61 67 65 72 43 68 65 63 6b   rc = pagerCheck
18600 46 6f 72 4f 72 44 65 6c 65 74 65 57 41 4c 28 70  ForOrDeleteWAL(p
18610 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
18620 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20   isWal = 0;.    
18630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
18640 3d 20 70 61 67 65 72 43 68 65 63 6b 46 6f 72 4f  = pagerCheckForO
18650 72 44 65 6c 65 74 65 57 41 4c 28 70 50 61 67 65  rDeleteWAL(pPage
18660 72 2c 20 26 69 73 57 61 6c 29 3b 0a 20 20 20 20  r, &isWal);.    
18670 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
18680 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18690 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20   if( isWal ){.  
186a0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
186b0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
186c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
186d0 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67  agerOpenWal(pPag
186e0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
186f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
18710 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65  c = pagerBeginRe
18720 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
18730 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ager);.        }
18740 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
18750 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18760 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
18770 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20  NALMODE_WAL ){. 
18780 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
18790 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
187a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
187b0 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  ELETE;.      }. 
187c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
187d0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
187e0 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73  /*.** Playback s
187f0 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f  avepoint pSavepo
18800 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76  int. Or, if pSav
18810 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68  epoint==NULL, th
18820 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74  en playback.** t
18830 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
18840 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18850 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69  he case pSavepoi
18860 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20  nt==NULL occurs 
18870 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42  when .** a ROLLB
18880 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
18890 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53  s invoked on a S
188a0 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73  AVEPOINT that is
188b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
188c0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ** savepoint..**
188d0 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f  .** When pSavepo
188e0 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  int is not NULL 
188f0 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74  (meaning a non-t
18900 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
18910 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e  oint is .** bein
18920 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20  g rolled back), 
18930 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
18940 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70  k consists of up
18950 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73   to three stages
18960 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69  ,.** performed i
18970 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63  n the order spec
18980 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ified:.**.**   *
18990 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   Pages are playe
189a0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
189b0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
189c0 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a  rting at byte.**
189d0 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65       offset Page
189e0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
189f0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
18a00 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67  g to .**     Pag
18a10 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
18a20 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68  Offset, or to th
18a30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
18a40 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
18a50 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61   file if PagerSa
18a60 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
18a70 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  et is zero..**.*
18a80 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61  *   * If PagerSa
18a90 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
18aa0 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  et is not zero, 
18ab0 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70  then pages are p
18ac0 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63  layed.**     bac
18ad0 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  k starting from 
18ae0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
18af0 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  er immediately f
18b00 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20  ollowing .**    
18b10 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
18b20 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68  iHdrOffset to th
18b30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
18b40 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  n journal file..
18b50 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
18b60 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20  are then played 
18b70 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75  back from the su
18b80 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
18b90 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20  starting.**     
18ba0 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61  with the PagerSa
18bb0 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20  vepoint.iSubRec 
18bc0 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
18bd0 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  o the end of.** 
18be0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
18bf0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f  file..**.** Thro
18c00 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62  ughout the rollb
18c10 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63  ack process, eac
18c20 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  h time a page is
18c30 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
18c40 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
18c50 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
18c60 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74   a bitvec struct
18c70 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44  ure (variable pD
18c80 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d  one in the.** im
18c90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c  plementation bel
18ca0 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65  ow). This is use
18cb0 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
18cc0 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a   a page is only.
18cd0 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ** rolled back t
18ce0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
18cf0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
18d00 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61  in either journa
18d10 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76  l..**.** If pSav
18d20 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  epoint is NULL, 
18d30 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f  then pages are o
18d40 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  nly played back 
18d50 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  from the main.**
18d60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18d70 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
18d80 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20  for a bitvec in 
18d90 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
18da0 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
18db0 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b   before playback
18dc0 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50   commences the P
18dd0 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69  ager.dbSize vari
18de0 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74  able.** is reset
18df0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68   to the value th
18e00 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68  at it held at th
18e10 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73  e start of the s
18e20 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72  avepoint .** (or
18e30 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e   transaction). N
18e40 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61  o page with a pa
18e50 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge-number greate
18e60 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
18e70 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62  e.** is played b
18e80 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65  ack. If one is e
18e90 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
18ea0 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e   simply skipped.
18eb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18ec0 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
18ed0 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
18ee0 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f  ger, PagerSavepo
18ef0 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29  int *pSavepoint)
18f00 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  Effective size o
18f30 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
18f40 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
18f50 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
18f60 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74   /* End of first
18f70 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e   segment of main
18f80 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73  -journal records
18f90 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
18fa0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
18fb0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
18fc0 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
18fd0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42   = 0;       /* B
18fe0 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20  itvec to ensure 
18ff0 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63  pages played bac
19000 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a  k only once */..
19010 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19020 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
19030 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41  HARED );..  /* A
19040 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
19050 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
19060 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
19070 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
19080 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
19090 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
190a0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
190b0 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
190c0 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
190d0 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
190e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
190f0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
19100 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61  .  /* Set the da
19110 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b  tabase size back
19120 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
19130 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20   was before the 
19140 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
19150 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77  being reverted w
19160 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  as opened..  */.
19170 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
19180 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20   = pSavepoint ? 
19190 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
191a0 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  g : pPager->dbOr
191b0 69 67 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20 21  igSize;..  if( !
191c0 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61  pSavepoint && pa
191d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
191e0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
191f0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
19200 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
19210 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
19220 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
19230 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
19240 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
19250 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
19260 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
19270 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
19280 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
19290 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
192a0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
192b0 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
192c0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
192d0 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
192e0 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
192f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
19300 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
19310 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
19320 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
19330 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
19340 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
19350 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a  0 || szJ==0 );..
19360 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
19370 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
19380 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
19390 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
193a0 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
193b0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
193c0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
193d0 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
193e0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
193f0 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
19400 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
19410 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
19420 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
19430 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
19440 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
19450 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
19460 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
19470 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
19480 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
19490 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
194a0 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
194b0 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
194c0 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
194d0 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
194e0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ( pSavepoint && 
194f0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
19500 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72  ger) ){.    iHdr
19510 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
19520 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
19530 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
19540 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
19550 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19560 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
19570 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
19580 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
19590 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
195a0 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
195b0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
195c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
195d0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
195e0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
195f0 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
19600 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
19610 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
19620 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
19630 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
19640 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
19650 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
19660 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
19670 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
19680 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
19690 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
196a0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
196b0 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
196c0 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
196d0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
196e0 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
196f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
19700 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
19710 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
19720 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
19730 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
19740 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
19750 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
19760 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
19770 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
19780 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
19790 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
197a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
197b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
197c0 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
197d0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
197e0 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
197f0 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
19800 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
19810 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
19820 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
19830 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
19840 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
19850 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
19860 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
19870 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
19880 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
19890 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
198a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
198b0 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
198c0 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
198d0 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
198e0 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
198f0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
19900 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
19910 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
19920 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
19930 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
19940 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
19950 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19960 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
19970 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
19980 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
19990 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
199a0 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
199b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
199c0 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
199d0 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
199e0 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
199f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
19a00 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
19a10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
19a20 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
19a30 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
19a40 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
19a50 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
19a60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
19a70 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
19a80 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
19a90 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
19aa0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
19ab0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
19ac0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19ad0 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f>=szJ );..  /* 
19ae0 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
19af0 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
19b00 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
19b10 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
19b20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
19b30 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
19b40 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
19b50 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
19b60 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
19b70 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
19b80 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
19b90 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
19ba0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
19bb0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
19bc0 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
19bd0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
19be0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
19bf0 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76  64 offset = pSav
19c00 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
19c10 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
19c20 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ize);..    if( p
19c30 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
19c40 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
19c50 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
19c60 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d  ointUndo(pPager-
19c70 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e  >pWal, pSavepoin
19c80 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  t->aWalData);.  
19c90 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70    }.    for(ii=p
19ca0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
19cb0 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
19cc0 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
19cd0 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
19ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
19cf0 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67  fset==ii*(4+pPag
19d00 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b  er->pageSize) );
19d10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
19d20 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
19d30 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66  age(pPager, &off
19d40 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31  set, pDone, 0, 1
19d50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
19d60 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
19d70 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  DONE );.  }..  s
19d80 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
19d90 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
19da0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19db0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
19dc0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
19dd0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
19de0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
19df0 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
19e00 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
19e10 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
19e20 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
19e30 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
19e40 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
19e50 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
19e60 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
19e70 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
19e80 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
19e90 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
19ea0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
19eb0 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
19ec0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
19ed0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
19ee0 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
19ef0 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
19f00 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
19f10 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
19f20 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
19f30 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
19f40 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
19f50 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
19f60 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
19f70 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
19f80 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
19f90 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
19fa0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
19fb0 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
19fc0 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
19fd0 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
19fe0 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
19ff0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
1a000 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
1a010 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
1a020 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1a030 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
1a040 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
1a050 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
1a060 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
1a070 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
1a080 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
1a090 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
1a0a0 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1a0c0 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
1a0d0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
1a0e0 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
1a0f0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
1a100 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
1a110 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
1a120 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
1a130 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
1a140 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
1a150 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
1a160 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
1a170 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
1a180 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
1a190 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
1a1a0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
1a1c0 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
1a1d0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1a1e0 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
1a1f0 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
1a200 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1a210 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
1a220 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
1a230 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
1a240 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
1a250 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
1a260 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
1a270 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
1a280 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
1a290 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
1a2a0 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
1a2b0 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1a2d0 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
1a2e0 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
1a2f0 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
1a300 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1a310 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
1a320 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
1a330 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
1a340 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
1a350 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
1a360 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
1a370 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
1a380 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
1a390 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
1a3a0 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
1a3b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
1a3c0 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
1a3d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
1a3e0 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
1a3f0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
1a400 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79  el, int bFullFsy
1a410 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
1a420 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
1a430 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
1a440 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
1a450 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
1a460 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
1a470 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1a480 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
1a490 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
1a4a0 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49  (bFullFsync?SQLI
1a4b0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c  TE_SYNC_FULL:SQL
1a4c0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
1a4d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1a4e0 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
1a4f0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
1a500 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1a510 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
1a520 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
1a530 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
1a540 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
1a550 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
1a560 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
1a570 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
1a580 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
1a590 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
1a5a0 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
1a5b0 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
1a5c0 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
1a5d0 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
1a5e0 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
1a5f0 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
1a600 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
1a610 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
1a620 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1a630 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74  into *pFile. Ret
1a640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1a650 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20   success .** or 
1a660 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1a670 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
1a680 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
1a690 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
1a6a0 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
1a6b0 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
1a6c0 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
1a6d0 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73  ** The flags pas
1a6e0 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c  sed to the VFS l
1a6f0 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c  ayer xOpen() cal
1a700 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63  l are those spec
1a710 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61  ified.** by para
1a720 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f  meter vfsFlags O
1a730 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c  Red with the fol
1a740 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
1a750 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
1a760 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53  ADWRITE.**     S
1a770 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1a780 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
1a790 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a  OPEN_EXCLUSIVE.*
1a7a0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
1a7b0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a  N_DELETEONCLOSE.
1a7c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1a7d0 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50  gerOpentemp(.  P
1a7e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1a7f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1a800 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  r object */.  sq
1a810 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1a820 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
1a830 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a840 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76   here */.  int v
1a850 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
1a860 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
1a870 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
1a880 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
1a890 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1a8a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1a8b0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1a8c0 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
1a8d0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
1a8e0 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
1a8f0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
1a900 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
1a910 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
1a920 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
1a930 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
1a940 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
1a950 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
1a960 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
1a970 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
1a980 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
1a990 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1a9a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  sOpen(pPager->pV
1a9b0 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66  fs, 0, pFile, vf
1a9c0 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
1a9d0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1a9e0 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46  _OK || isOpen(pF
1a9f0 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ile) );.  return
1aa00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
1aa10 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
1aa20 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  er function..**.
1aa30 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76  ** The pager inv
1aa40 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61  okes the busy-ha
1aa50 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33  ndler if sqlite3
1aa60 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  OsLock() returns
1aa70 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59   .** SQLITE_BUSY
1aa80 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
1aa90 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d  upgrade from no-
1aaa0 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44  lock to a SHARED
1aab0 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65   lock,.** or whe
1aac0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
1aad0 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
1aae0 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45  VED lock to an E
1aaf0 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63  XCLUSIVE .** loc
1ab00 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a  k. It does *not*
1ab10 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1ab20 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70   handler when up
1ab30 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20  grading from.** 
1ab40 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
1ab50 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72  ED, or when upgr
1ab60 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45  ading from SHARE
1ab70 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a  D to EXCLUSIVE.*
1ab80 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20  * (which occurs 
1ab90 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e  during hot-journ
1aba0 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75  al rollback). Su
1abb0 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  mmary:.**.**   T
1abc0 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20  ransition       
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abe0 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79   | Invokes xBusy
1abf0 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d  Handler.**   ---
1ac00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac30 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  -----.**   NO_LO
1ac40 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52  CK       -> SHAR
1ac50 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59  ED_LOCK      | Y
1ac60 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  es.**   SHARED_L
1ac70 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45  OCK   -> RESERVE
1ac80 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a  D_LOCK    | No.*
1ac90 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
1aca0 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c    -> EXCLUSIVE_L
1acb0 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  OCK   | No.**   
1acc0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e  RESERVED_LOCK ->
1acd0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
1ace0 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66    | Yes.**.** If
1acf0 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
1ad00 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  r callback retur
1ad10 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
1ad20 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74   lock is .** ret
1ad30 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75  ried. If it retu
1ad40 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  rns zero, then t
1ad50 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  he SQLITE_BUSY e
1ad60 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72  rror is.** retur
1ad70 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
1ad80 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41  r of the pager A
1ad90 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
1ada0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1adb0 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
1adc0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1add0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ade0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1adf0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
1ae00 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
1ae10 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20  (void *),       
1ae20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1ae30 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
1ae40 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
1ae50 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae70 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70  /* Argument to p
1ae80 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64  ass to xBusyHand
1ae90 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50  ler */.){  .  pP
1aea0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
1aeb0 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65  er = xBusyHandle
1aec0 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  r;.  pPager->pBu
1aed0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70  syHandlerArg = p
1aee0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a  BusyHandlerArg;.
1aef0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
1af00 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73  the page size us
1af10 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20  ed by the Pager 
1af20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20  object. The new 
1af30 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73  page size .** is
1af40 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67   passed in *pPag
1af50 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
1af60 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
1af70 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
1af80 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1af90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
1afa0 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
1afb0 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
1afc0 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20  ed is the error 
1afd0 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
1afe0 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f   (i.e. .** one o
1aff0 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  f SQLITE_IOERR, 
1b000 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f  SQLITE_CORRUPT o
1b010 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a  r SQLITE_FULL)..
1b020 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1b030 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
1b040 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1b050 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  e:.**.**   * the
1b060 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28   new page size (
1b070 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53  value of *pPageS
1b080 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61  ize) is valid (a
1b090 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f   power .**     o
1b0a0 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31  f two between 51
1b0b0 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58  2 and SQLITE_MAX
1b0c0 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c  _PAGE_SIZE, incl
1b0d0 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  usive), and.**.*
1b0e0 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20  *   * there are 
1b0f0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  no outstanding p
1b100 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20  age references, 
1b110 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
1b120 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69  e database is ei
1b130 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d  ther not an in-m
1b140 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f  emory database o
1b150 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61  r it is.**     a
1b160 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1b170 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e  base that curren
1b180 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  tly consists of 
1b190 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  zero pages..**.*
1b1a0 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  * then the pager
1b1b0 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a   object page siz
1b1c0 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61  e is set to *pPa
1b1d0 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
1b1e0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
1b1f0 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20  s changed, then 
1b200 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73  this function us
1b210 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  es sqlite3PagerM
1b220 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f  alloc() .** to o
1b230 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65  btain a new Page
1b240 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
1b250 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f  er. If this allo
1b260 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a  cation attempt .
1b270 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
1b280 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
1b290 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
1b2a0 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63  size remains unc
1b2b0 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61  hanged. .** In a
1b2c0 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  ll other cases, 
1b2d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1b2e0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
1b2f0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
1b300 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69   not changed, ei
1b310 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ther because one
1b320 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74   of the enumerat
1b330 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  ed.** conditions
1b340 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72   above is not tr
1b350 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61  ue, the pager wa
1b360 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
1b370 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75   when this.** fu
1b380 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
1b390 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  d, or because th
1b3a0 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
1b3b0 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ion attempt fail
1b3c0 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50  ed, .** then *pP
1b3d0 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74  ageSize is set t
1b3e0 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69  o the old, retai
1b3f0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65  ned page size be
1b400 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1b410 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1b420 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
1b430 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31  ager *pPager, u1
1b440 36 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e  6 *pPageSize, in
1b450 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
1b460 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
1b470 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20  errCode;..  if( 
1b480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b490 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a  .    u16 pageSiz
1b4a0 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
1b4b0 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
1b4c0 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
1b4d0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
1b4e0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
1b4f0 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
1b500 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d      if( (pPager-
1b510 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
1b520 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
1b530 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
1b540 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
1b550 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
1b560 30 20 0a 20 20 20 20 20 26 26 20 70 61 67 65 53  0 .     && pageS
1b570 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
1b580 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  =pPager->pageSiz
1b590 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e .    ){.      
1b5a0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
1b5b0 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
1b5c0 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
1b5d0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
1b5e0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
1b5f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1b600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b610 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
1b620 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1b630 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1b640 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
1b650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1b660 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
1b670 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
1b680 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
1b690 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
1b6a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
1b6b0 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50  heSetPageSize(pP
1b6c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
1b6d0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1b6e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61  }.    }.    *pPa
1b6f0 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 50  geSize = (u16)pP
1b700 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1b710 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65      if( nReserve
1b720 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20  <0 ) nReserve = 
1b730 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
1b740 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52  ;.    assert( nR
1b750 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
1b760 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20  serve<1000 );.  
1b770 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72    pPager->nReser
1b780 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72  ve = (i16)nReser
1b790 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
1b7a0 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
1b7b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b7c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1b7d0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1b7e0 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
1b7f0 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
1b800 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
1b810 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
1b820 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
1b830 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
1b840 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
1b850 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
1b860 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
1b870 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
1b880 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
1b890 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
1b8a0 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
1b8b0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
1b8c0 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
1b8d0 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
1b8e0 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
1b8f0 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
1b900 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
1b910 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
1b920 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
1b930 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
1b940 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
1b950 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1b960 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1b970 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
1b980 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
1b990 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
1b9a0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
1b9b0 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
1b9c0 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
1b9d0 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
1b9e0 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
1b9f0 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
1ba00 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
1ba10 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
1ba20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
1ba30 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1ba40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ba50 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
1ba60 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
1ba70 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
1ba80 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
1ba90 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
1baa0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
1bab0 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
1bac0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
1bad0 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20  {.  int nPage;. 
1bae0 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
1baf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
1bb00 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
1bb10 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1bb20 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1bb30 4f 43 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  OCK ){.    sqlit
1bb40 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1bb50 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
1bb60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  ;.    assert( (i
1bb70 6e 74 29 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  nt)pPager->mxPgn
1bb80 6f 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 7d 0a  o>=nPage );.  }.
1bb90 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1bba0 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
1bbb0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1bbc0 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
1bbd0 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
1bbe0 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
1bbf0 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
1bc00 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
1bc10 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
1bc20 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
1bc30 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
1bc40 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
1bc50 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
1bc60 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
1bc70 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
1bc80 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
1bc90 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
1bca0 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
1bcb0 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
1bcc0 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
1bcd0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1bce0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
1bcf0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
1bd00 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
1bd10 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
1bd20 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
1bd30 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
1bd40 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
1bd50 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
1bd60 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
1bd70 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
1bd80 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
1bd90 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
1bda0 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
1bdb0 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
1bdc0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
1bdd0 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
1bde0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
1bdf0 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
1be00 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
1be10 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
1be20 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
1be30 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
1be40 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
1be50 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
1be60 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
1be70 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
1be80 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1be90 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
1bea0 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
1beb0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
1bec0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
1bed0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
1bee0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28  transient file (
1bef0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20  zFilename==""), 
1bf00 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20  or.** opened on 
1bf10 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e  a file less than
1bf20 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   N bytes in size
1bf30 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  , the output buf
1bf40 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64  fer is.** zeroed
1bf50 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1bf60 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74  eturned. The rat
1bf70 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20  ionale for this 
1bf80 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a  is that this .**
1bf90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1bfa0 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  d to read databa
1bfb0 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20  se headers, and 
1bfc0 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20  a new transient 
1bfd0 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64  or.** zero sized
1bfe0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20   database has a 
1bff0 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73  header than cons
1c000 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
1c010 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   zeroes..**.** I
1c020 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61  f any IO error a
1c030 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  part from SQLITE
1c040 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c050 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  D is encountered
1c060 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63  ,.** the error c
1c070 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1c080 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e  to the caller an
1c090 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
1c0a0 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
1c0b0 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64  buffer undefined
1c0c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c0d0 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
1c0e0 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
1c0f0 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
1c100 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
1c110 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c120 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
1c130 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
1c140 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1c150 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
1c160 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1c170 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
1c180 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
1c190 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d  led by btree imm
1c1a0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63  ediately after c
1c1b0 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
1c1c0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20   Pager object.  
1c1d0 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65  There has not be
1c1e0 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  en an opportunit
1c1f0 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a  y to transition.
1c200 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65    ** to WAL mode
1c210 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   yet..  */.  ass
1c220 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
1c230 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
1c240 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1c250 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
1c260 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
1c270 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
1c280 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
1c290 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1c2a0 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
1c2b0 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
1c2c0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1c2d0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1c2e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c2f0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1c300 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c310 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
1c320 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1c330 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1c340 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69  base file associ
1c350 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50  ated .** with pP
1c360 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ager. Normally, 
1c370 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74  this is calculat
1c380 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20  ed as (<db file 
1c390 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65  size>/<page-size
1c3a0 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  >)..** However, 
1c3b0 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62  if the file is b
1c3c0 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61  etween 1 and <pa
1c3d0 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69  ge-size> bytes i
1c3e0 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a  n size, then .**
1c3f0 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65   this is conside
1c400 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c  red a 1 page fil
1c410 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1c420 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f  pager is in erro
1c430 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
1c440 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1c450 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a  lled, then the.*
1c460 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  * error state er
1c470 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1c480 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65  rned and *pnPage
1c490 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
1c4a0 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66   Or,.** if the f
1c4b0 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73 20 74  ile system has t
1c4c0 6f 20 62 65 20 71 75 65 72 69 65 64 20 66 6f 72  o be queried for
1c4d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1c4e0 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65   file and.** the
1c4f0 20 71 75 65 72 79 20 61 74 74 65 6d 70 74 20 72   query attempt r
1c500 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72  eturns an IO err
1c510 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  or, the IO error
1c520 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1c530 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65  d.** and *pnPage
1c540 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
1c550 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ed..**.** Otherw
1c560 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69  ise, if everythi
1c570 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
1c580 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
1c590 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
1c5a0 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73  and *pnPage is s
1c5b0 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1c5c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1c5d0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
1c5e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
1c5f0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1c600 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
1c610 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1c620 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1c630 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1c640 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
1c650 2a 2f 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69  */..  /* Determi
1c660 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ne the number of
1c670 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
1c680 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69  le. Store this i
1c690 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66  n nPage. */.  if
1c6a0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1c6b0 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61  Valid ){.    nPa
1c6c0 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ge = pPager->dbS
1c6d0 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ize;.  }else{.  
1c6e0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1c6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
1c700 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  or returned by O
1c710 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20  sFileSize() */. 
1c720 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20     i64 n = 0;   
1c730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1c740 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  le size in bytes
1c750 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46   returned by OsF
1c760 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20  ileSize() */..  
1c770 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
1c780 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
1c790 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1c7a0 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
1c7b0 20 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69    sqlite3WalDbsi
1c7c0 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  ze(pPager->pWal,
1c7d0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a   &nPage);.    }.
1c7e0 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
1c7f0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1c800 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1c810 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1c820 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1c830 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
1c840 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1c850 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
1c860 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
1c870 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1c880 65 72 2d 3e 66 64 2c 20 26 6e 29 29 20 29 7b 0a  er->fd, &n)) ){.
1c890 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
1c8a0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1c8b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1c8c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1c8d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1c8e0 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
1c8f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
1c900 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d  .        nPage =
1c910 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
1c920 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d  .        nPage =
1c930 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67   (Pgno)(n / pPag
1c940 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c950 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c960 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1c970 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1c980 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1c990 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
1c9a0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1c9b0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
1c9c0 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ge;.      pPager
1c9d0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
1c9e0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1c9f0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1ca00 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1ca10 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1ca20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1ca30 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  e .  ** configur
1ca40 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
1ca50 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
1ca60 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
1ca70 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
1ca80 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
1ca90 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
1caa0 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
1cab0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
1cac0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
1cad0 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
1cae0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
1caf0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e  tput variable an
1cb00 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1cb10 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50 61 67 65 20  OK */.  *pnPage 
1cb20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1cb30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1cb40 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
1cb50 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
1cb60 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
1cb70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cb80 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
1cb90 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
1cba0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
1cbb0 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
1cbc0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
1cbd0 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
1cbe0 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
1cbf0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
1cc00 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
1cc10 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
1cc20 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
1cc30 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
1cc40 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
1cc50 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
1cc60 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
1cc70 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
1cc80 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
1cc90 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
1cca0 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
1ccb0 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
1ccc0 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
1ccd0 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
1cce0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1ccf0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1cd00 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
1cd10 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
1cd20 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
1cd30 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
1cd40 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
1cd50 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
1cd60 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
1cd70 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
1cd80 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
1cd90 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1cda0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1cdb0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
1cdc0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1cdd0 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
1cde0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1ce10 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53   */..  /* The OS
1ce20 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73   lock values mus
1ce30 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
1ce40 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20   the Pager lock 
1ce50 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65  values */.  asse
1ce60 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
1ce70 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
1ce80 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
1ce90 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
1cea0 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
1ceb0 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
1cec0 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
1ced0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
1cee0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75  f the file is cu
1cef0 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
1cf00 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d   then the size m
1cf10 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 2e 20  ust be unknown. 
1cf20 49 74 0a 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74  It.  ** must not
1cf30 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
1cf40 69 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ied at this poin
1cf50 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
1cf60 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1cf70 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
1cf80 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
1cf90 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73  alid==0 );.  ass
1cfa0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1cfb0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1cfc0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f   || pPager->dbMo
1cfd0 64 69 66 69 65 64 3d 3d 30 20 29 3b 0a 0a 20 20  dified==0 );..  
1cfe0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
1cff0 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
1d000 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
1d010 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
1d020 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
1d030 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
1d040 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
1d050 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
1d060 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
1d070 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
1d080 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
1d090 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
1d0a0 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
1d0b0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
1d0c0 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
1d0d0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73  sert( (pPager->s
1d0e0 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  tate>=locktype).
1d0f0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
1d100 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1d110 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  UNLOCK && lockty
1d120 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  pe==PAGER_SHARED
1d130 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
1d140 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1d150 52 5f 52 45 53 45 52 56 45 44 20 26 26 20 6c 6f  R_RESERVED && lo
1d160 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 45 58  cktype==PAGER_EX
1d170 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20  CLUSIVE).  );.. 
1d180 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1d190 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
1d1a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d1b0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
1d1c0 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
1d1d0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1d1e0 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
1d1f0 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
1d200 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
1d210 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
1d220 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
1d230 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
1d240 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  g) );.    if( rc
1d250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d260 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1d270 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  te = (u8)locktyp
1d280 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  e;.      IOTRACE
1d290 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
1d2a0 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  , pPager, lockty
1d2b0 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pe)).    }.  }. 
1d2c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d2d0 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73  *.** Function as
1d2e0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
1d2f0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63  traint(pPager) c
1d300 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f  hecks that one o
1d310 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
1d320 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20  ing is true for 
1d330 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
1d340 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
1d350 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a   page-cache:.**.
1d360 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65  **   a) The page
1d370 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
1d380 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1d390 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1d3a0 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e   .**      curren
1d3b0 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  t database image
1d3c0 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a  , in pages, OR.*
1d3d0 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65  *.**   b) if the
1d3e0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65   page content we
1d3f0 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68  re written at th
1d400 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c  is time, it woul
1d410 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65  d not.**      be
1d420 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
1d430 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
1d440 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74  content out to t
1d450 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
1d460 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72  *      (as deter
1d470 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f  mined by functio
1d480 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  n subjRequiresPa
1d490 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ge())..**.** If 
1d4a0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73  the condition as
1d4b0 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66  serted by this f
1d4c0 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  unction were not
1d4d0 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a   true, and the.*
1d4e0 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72  * dirty page wer
1d4f0 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  e to be discarde
1d500 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
1d510 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74   via the pagerSt
1d520 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  ress().** routin
1d530 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29  e, pagerStress()
1d540 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65   would not write
1d550 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1d560 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20  e content to.** 
1d570 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d580 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e  e. If a savepoin
1d590 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65  t transaction we
1d5a0 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  re rolled back a
1d5b0 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70  fter.** this hap
1d5c0 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65  pened, the corre
1d5d0 63 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75  ct behaviour wou
1d5e0 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
1d5f0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1d600 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
1d610 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
1d620 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
1d630 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
1d640 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
1d650 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
1d660 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
1d670 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1d680 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
1d690 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
1d6a0 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
1d6b0 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
1d6c0 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
1d6d0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
1d6e0 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
1d6f0 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
1d700 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
1d710 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
1d720 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
1d730 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
1d740 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d750 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
1d760 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
1d770 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
1d780 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
1d790 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
1d7a0 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
1d7b0 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
1d7c0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
1d7d0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
1d7e0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
1d7f0 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
1d800 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
1d810 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
1d820 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
1d830 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
1d840 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
1d850 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
1d860 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
1d870 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
1d880 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
1d890 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
1d8a0 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
1d8b0 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
1d8c0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
1d8d0 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
1d8e0 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
1d8f0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
1d900 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
1d910 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
1d920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
1d930 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
1d940 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
1d950 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
1d960 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
1d970 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
1d980 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
1d990 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
1d9a0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1d9b0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
1d9c0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1d9d0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
1d9e0 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
1d9f0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
1da00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1da10 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
1da20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1da30 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
1da40 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1da50 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1da60 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1da70 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1da80 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65   = nPage;.  asse
1da90 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
1daa0 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  aint(pPager);.}.
1dab0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1dac0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1dad0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1dae0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
1daf0 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
1db00 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
1db10 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
1db20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
1db30 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
1db40 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
1db50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1db60 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
1db70 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
1db80 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
1db90 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
1dba0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
1dbb0 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
1dbc0 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
1dbd0 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
1dbe0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1dbf0 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
1dc00 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
1dc10 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
1dc20 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
1dc30 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
1dc40 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
1dc50 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
1dc60 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
1dc70 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
1dc80 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
1dc90 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
1dca0 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
1dcb0 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
1dcc0 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
1dcd0 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
1dce0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1dcf0 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
1dd00 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1dd10 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
1dd20 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
1dd30 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1dd40 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
1dd50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1dd60 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
1dd70 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
1dd80 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1dd90 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
1dda0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
1ddb0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1ddc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1ddd0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1dde0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1ddf0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
1de00 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
1de10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1de20 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
1de30 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
1de40 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
1de50 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
1de60 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
1de70 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
1de80 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
1de90 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1dea0 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
1deb0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1dec0 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
1ded0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
1dee0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
1def0 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
1df00 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
1df10 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
1df20 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
1df30 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
1df40 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
1df50 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1df60 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
1df70 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
1df80 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
1df90 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1dfa0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
1dfb0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
1dfc0 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
1dfd0 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
1dfe0 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
1dff0 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
1e000 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
1e010 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
1e020 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
1e030 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
1e040 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
1e050 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
1e060 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
1e070 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
1e080 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
1e090 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e0a0 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20   u8 *pTmp = (u8 
1e0b0 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
1e0c0 61 63 65 3b 0a 0a 20 20 64 69 73 61 62 6c 65 5f  ace;..  disable_
1e0d0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
1e0e0 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ors();.  sqlite3
1e0f0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
1e100 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  c();.  pPager->e
1e110 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
1e120 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1e130 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
1e140 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1e150 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f  .  sqlite3WalClo
1e160 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  se(pPager->pWal,
1e170 0a 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f  .    (pPager->no
1e180 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61 67 65  Sync ? 0 : pPage
1e190 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c 20  r->sync_flags), 
1e1a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67  .    pPager->pag
1e1b0 65 53 69 7a 65 2c 20 70 54 6d 70 0a 20 20 29 3b  eSize, pTmp.  );
1e1c0 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  .  pPager->pWal 
1e1d0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61  = 0;.#endif.  pa
1e1e0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1e1f0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1e200 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
1e210 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  ck(pPager);.  }e
1e220 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20  lse{.    /* Set 
1e230 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72  Pager.journalHdr
1e240 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62   to -1 for the b
1e250 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70 61  enefit of the pa
1e260 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a  ger_playback() .
1e270 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63      ** call whic
1e280 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72  h may be made fr
1e290 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 55  om within pagerU
1e2a0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
1e2b0 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a  (). If it.    **
1e2c0 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e   is not -1, then
1e2d0 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f   the unsynced po
1e2e0 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e  rtion of an open
1e2f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
1e300 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79  y.    ** be play
1e310 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
1e320 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
1e330 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
1e340 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a  curs while.    *
1e350 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
1e360 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
1e370 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72  e may become cor
1e380 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rupt..    */.   
1e390 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1e3a0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
1e3b0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1e3c0 65 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  e = pagerSyncHot
1e3d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1e3e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
1e3f0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
1e400 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
1e410 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
1e420 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
1e430 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
1e440 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
1e450 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
1e460 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1e470 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
1e480 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
1e490 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
1e4a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
1e4b0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c  ger->jfd);.  sql
1e4c0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
1e4d0 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
1e4e0 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
1e4f0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
1e500 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
1e510 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
1e520 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
1e530 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
1e540 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
1e550 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
1e560 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
1e570 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1e580 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
1e590 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
1e5a0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
1e5b0 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
1e5c0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1e5d0 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
1e5e0 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
1e5f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
1e600 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
1e610 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1e620 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
1e630 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1e640 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
1e650 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
1e660 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
1e670 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
1e680 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
1e690 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
1e6a0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
1e6b0 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
1e6c0 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
1e6d0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
1e6e0 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
1e6f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e700 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
1e710 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
1e720 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
1e730 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
1e740 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
1e750 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
1e760 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
1e770 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
1e780 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1e790 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
1e7a0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
1e7b0 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
1e7c0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
1e7d0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
1e7e0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
1e7f0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1e800 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
1e810 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
1e820 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f 74  Sync flag is not
1e830 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
1e840 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a  function is a.**
1e850 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
1e860 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
1e870 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
1e880 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
1e890 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 65  de.** and the de
1e8a0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1e8b0 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20  tics of the the 
1e8c0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20  file-system, as 
1e8d0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1e8e0 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
1e8f0 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d  l file is an in-
1e900 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
1e910 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e  ile, no action n
1e920 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61  eed.**     be ta
1e930 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f  ken..**.**   * O
1e940 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1e950 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
1e960 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46   support the SAF
1e970 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
1e980 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74  y,.**     then t
1e990 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
1e9a0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1e9b0 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
1e9c0 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  al header.**    
1e9d0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63   is updated to c
1e9e0 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
1e9f0 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63  r of journal rec
1ea00 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ords that have.*
1ea10 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74  *     been writt
1ea20 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  en following it.
1ea30 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1ea40 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75   operating in fu
1ea50 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d  ll-sync.**     m
1ea60 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
1ea70 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
1ea80 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nced before this
1ea90 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
1eaa0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  d..**.**   * If 
1eab0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
1eac0 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
1ead0 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65  SEQUENTIAL prope
1eae0 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20  rty, then .**   
1eaf0 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
1eb00 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
1eb10 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f  Or, in pseudo-co
1eb20 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  de:.**.**   if( 
1eb30 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a  NOT <in-memory j
1eb40 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20  ournal> ){.**   
1eb50 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41    if( NOT SAFE_A
1eb60 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20  PPEND ){.**     
1eb70 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63    if( <full-sync
1eb80 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c   mode> ) xSync(<
1eb90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
1eba0 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65  **       <update
1ebb0 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20   nRec field>.** 
1ebc0 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66      } .**     if
1ebd0 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c  ( NOT SEQUENTIAL
1ebe0 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
1ebf0 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d  l file>);.**   }
1ec00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
1ec10 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
1ec20 73 20 6e 65 76 65 72 20 62 65 20 73 65 74 20 66  s never be set f
1ec30 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1ec40 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69  es, or any.** fi
1ec50 6c 65 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  le operating in 
1ec60 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50 61  no-sync mode (Pa
1ec70 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74  ger.noSync set t
1ec80 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a  o non-zero)..**.
1ec90 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1eca0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
1ecb0 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f  lears the PGHDR_
1ecc0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
1ecd0 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65  f every .** page
1ece0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1ecf0 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65  in memory before
1ed00 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
1ed10 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a  E_OK. If an IO.*
1ed20 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  * error is encou
1ed30 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65  ntered, then the
1ed40 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1ed50 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
1ed60 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
1ed70 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
1ed80 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
1ed90 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
1eda0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
1edb0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1edc0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1edd0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1ede0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
1edf0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
1ee00 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e  MORY ){.      in
1ee10 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1ee40 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
1ee50 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
1ee60 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1ee70 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1ee80 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
1ee90 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1eea0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
1eeb0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
1eec0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1eed0 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
1eee0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
1eef0 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
1ef00 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
1ef10 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
1ef20 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
1ef30 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
1ef40 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
1ef50 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
1ef60 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
1ef70 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
1ef80 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
1ef90 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
1efa0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
1efb0 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
1efc0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
1efd0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
1efe0 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
1eff0 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
1f000 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
1f010 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
1f020 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
1f030 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
1f040 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
1f050 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
1f060 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20  us connection's 
1f070 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
1f080 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
1f090 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
1f0a0 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
1f0b0 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
1f0c0 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
1f0d0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
1f0e0 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
1f0f0 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
1f100 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1f110 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
1f120 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
1f130 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
1f140 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
1f150 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
1f160 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
1f170 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
1f180 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
1f190 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
1f1a0 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
1f1b0 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
1f1c0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
1f1d0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
1f1e0 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
1f1f0 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
1f200 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
1f210 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
1f220 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
1f230 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
1f240 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
1f250 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1f260 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
1f270 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
1f280 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
1f290 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
1f2a0 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
1f2b0 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
1f2c0 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
1f2d0 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
1f2e0 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
1f2f0 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
1f300 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
1f310 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
1f320 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
1f330 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
1f340 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
1f350 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
1f360 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1f370 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
1f380 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
1f390 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
1f3a0 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
1f3b0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
1f3c0 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
1f3d0 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
1f3e0 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
1f3f0 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
1f400 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
1f410 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
1f420 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
1f430 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
1f440 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1f450 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
1f460 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
1f470 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20  8 aMagic[8];.   
1f480 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b       u8 zHeader[
1f490 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1f4a0 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20  agic)+4];..     
1f4b0 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
1f4c0 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
1f4d0 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
1f4e0 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
1f4f0 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
1f500 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
1f510 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
1f520 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
1f530 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
1f540 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
1f550 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
1f560 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f570 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1f580 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
1f590 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
1f5a0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1f5b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f5c0 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
1f5d0 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
1f5e0 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
1f5f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1f600 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
1f610 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f620 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1f630 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
1f640 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
1f650 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
1f660 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1f670 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1f680 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1f690 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1f6a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1f6b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
1f6c0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1f6d0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1f6e0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1f6f0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
1f700 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
1f710 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
1f720 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
1f730 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
1f740 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
1f750 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
1f760 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
1f770 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
1f780 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
1f790 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
1f7a0 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
1f7b0 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
1f7c0 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
1f7d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
1f7e0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1f7f0 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
1f800 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
1f810 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
1f820 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
1f830 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
1f840 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
1f850 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
1f860 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
1f870 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
1f880 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
1f890 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
1f8a0 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
1f8b0 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
1f8c0 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
1f8d0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1f8e0 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
1f8f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
1f900 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
1f910 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
1f920 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1f930 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
1f940 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
1f950 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1f960 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
1f970 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1f980 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1f990 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1f9a0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1f9b0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1f9c0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1f9d0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
1f9e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1f9f0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
1fa00 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
1fa10 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
1fa20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fa30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1fa40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fa50 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
1fa60 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
1fa70 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
1fa80 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20  alHdr));.       
1fa90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1faa0 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
1fab0 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a    pPager->jfd, z
1fac0 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1fad0 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d  Header), pPager-
1fae0 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20  >journalHdr.    
1faf0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1fb00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fb10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1fb20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1fb30 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1fb40 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
1fb50 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45   ){.        PAGE
1fb60 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
1fb70 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
1fb80 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1fb90 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
1fba0 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
1fbb0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
1fbc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1fbd0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
1fbe0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1fbf0 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20  flags| .        
1fc00 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f    (pPager->sync_
1fc10 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  flags==SQLITE_SY
1fc20 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
1fc30 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
1fc40 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1fc50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fc60 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1fc70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fc80 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  .    /* The jour
1fc90 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
1fca0 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  t successfully s
1fcb0 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65 72  ynced. Set Pager
1fcc0 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a  .needSync .    *
1fcd0 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c  * to zero and cl
1fce0 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
1fcf0 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
1fd00 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20 20  all pagess..    
1fd10 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
1fd20 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
1fd30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1fd40 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  Started = 1;.   
1fd50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1fd60 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
1fd70 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 73 71  urnalOff;.    sq
1fd80 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
1fd90 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
1fda0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a  ->pPCache);.  }.
1fdb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fdc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1fdd0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1fde0 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
1fdf0 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74  ked list of dirt
1fe00 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  y pages connecte
1fe10 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64  d.** by the PgHd
1fe20 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
1fe30 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1fe40 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20  writes each one 
1fe50 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  of the.** in-mem
1fe60 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ory pages in the
1fe70 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74   list to the dat
1fe80 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1fe90 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20  argument may.** 
1fea0 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65  be NULL, represe
1feb0 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c  nting an empty l
1fec0 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
1fed0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1fee0 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is.** a no-op..*
1fef0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d  *.** The pager m
1ff00 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  ust hold at leas
1ff10 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
1ff20 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  k when this func
1ff30 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
1ff40 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  d. Before writin
1ff50 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  g anything to th
1ff60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1ff70 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73   this lock.** is
1ff80 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20   upgraded to an 
1ff90 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1ffa0 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
1ffb0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
1ffc0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
1ffd0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  s returned and n
1ffe0 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  o data is writte
1fff0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
20000 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49  e file..** .** I
20010 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
20020 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72   temp-file pager
20030 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20   and the actual 
20040 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65  file-system file
20050 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  .** is not yet o
20060 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74  pen, it is creat
20070 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65  ed and opened be
20080 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
20090 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74   .** written out
200a0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65  ..**.** Once the
200b0 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75   lock has been u
200c0 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20  pgraded and, if 
200d0 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66  necessary, the f
200e0 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74  ile opened,.** t
200f0 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69  he pages are wri
20100 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
20110 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
20120 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69   list order. Wri
20130 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69  ting.** a page i
20140 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20  s skipped if it 
20150 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20  meets either of 
20160 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
20170 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  iteria:.**.**   
20180 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
20190 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
201a0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
201b0 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47  or.**   * The PG
201c0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
201d0 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
201e0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
201f0 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70   writing out a p
20200 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64  age causes the d
20210 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
20220 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69  grow, Pager.dbFi
20230 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64  leSize.** is upd
20240 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
20250 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77  . If page 1 is w
20260 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e  ritten out, then
20270 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65   the value cache
20280 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62  d.** in Pager.db
20290 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70  FileVers[] is up
202a0 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74  dated to match t
202b0 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f  he new value sto
202c0 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61  red in.** the da
202d0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
202e0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
202f0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
20300 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
20310 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
20320 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
20330 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
20340 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
20350 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55  Or, if the EXCLU
20360 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  SIVE lock cannot
20370 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  .** be obtained,
20380 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
20390 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
203a0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
203b0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
203c0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
203d0 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203f0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
20400 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ct */.  int rc; 
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20430 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
20440 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 69 73    if( NEVER(pLis
20450 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 53  t==0) ) return S
20460 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
20470 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67  er = pList->pPag
20480 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  er;..  /* At thi
20490 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
204a0 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45  y be either a RE
204b0 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
204c0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
204d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
204e0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
204f0 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55  already an EXCLU
20500 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66  SIVE lock, the f
20510 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61  ollowing.  ** ca
20520 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
20530 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
20540 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
20550 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
20560 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
20570 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
20580 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
20590 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
205a0 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
205b0 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
205c0 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
205d0 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
205e0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
205f0 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
20600 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
20610 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
20620 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
20630 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
20640 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
20650 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
20660 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
20670 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
20680 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
20690 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
206a0 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
206b0 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
206c0 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
206d0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
206e0 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
206f0 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
20700 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
20710 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
20720 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
20730 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
20740 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
20750 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
20760 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
20770 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
20780 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
20790 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
207a0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
207b0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
207c0 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
207d0 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
207e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
207f0 61 67 65 72 55 73 65 57 61 6c 28 70 4c 69 73 74  agerUseWal(pList
20800 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  ->pPager) );.  a
20810 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20820 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
20830 52 56 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70  RVED );.  rc = p
20840 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
20850 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
20860 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a  IVE_LOCK);..  /*
20870 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
20880 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
20890 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
208a0 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
208b0 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
208c0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
208d0 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
208e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
208f0 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
20900 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
20910 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
20920 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
20930 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
20940 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
20950 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
20960 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
20970 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
20980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
20990 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
209a0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
209b0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
209c0 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
209d0 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
209e0 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
209f0 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
20a00 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
20a10 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
20a20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
20a30 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
20a40 3e 64 62 53 69 7a 65 20 3e 20 28 70 50 61 67 65  >dbSize > (pPage
20a50 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2b 31 29  r->dbOrigSize+1)
20a60 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
20a70 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 73 71  r->fd) ){.    sq
20a80 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69  lite3_int64 szFi
20a90 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  le = pPager->pag
20aa0 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33  eSize * (sqlite3
20ab0 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64  _int64)pPager->d
20ac0 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74  bSize;.    sqlit
20ad0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
20ae0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
20af0 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
20b00 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20  NT, &szFile);.  
20b10 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
20b20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
20b30 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
20b40 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
20b50 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
20b60 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
20b70 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
20b80 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
20b90 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
20ba0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
20bb0 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
20bc0 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
20bd0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
20be0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
20bf0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
20c00 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
20c10 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
20c20 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
20c30 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
20c40 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
20c50 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
20c60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
20c70 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
20c80 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
20c90 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
20ca0 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
20cb0 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
20cc0 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
20cd0 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
20ce0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
20cf0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
20d00 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
20d10 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
20d20 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
20d30 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
20d40 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
20d50 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
20d60 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
20d70 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
20d80 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20da0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
20db0 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
20dc0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64  ..      /* Encod
20dd0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  e the database *
20de0 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  /.      CODEC2(p
20df0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
20e00 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65  ata, pgno, 6, re
20e10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20e20 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  M, pData);..    
20e30 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74    /* Write out t
20e40 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f  he page data. */
20e50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20e60 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
20e70 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
20e80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
20e90 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20  offset);..      
20ea0 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73  /* If page 1 was
20eb0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75   just written, u
20ec0 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69  pdate Pager.dbFi
20ed0 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a  leVers to match.
20ee0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
20ef0 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e  ue now stored in
20f00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20f10 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74  le. If writing t
20f20 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61  his .      ** pa
20f30 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61  ge caused the da
20f40 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
20f50 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69  row, update dbFi
20f60 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a  leSize. .      *
20f70 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  /.      if( pgno
20f80 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
20f90 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
20fa0 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
20fb0 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
20fc0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
20fd0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
20fe0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
20ff0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
21000 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
21010 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
21020 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  no;.      }..   
21030 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
21040 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
21050 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
21060 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
21070 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
21080 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
21090 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
210a0 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
210b0 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
210c0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
210d0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
210e0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21100 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
21110 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
21120 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
21130 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
21140 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
21150 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
21160 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
21170 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
21180 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
21190 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
211a0 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
211b0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
211c0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
211d0 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
211e0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
211f0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
21200 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
21210 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
21220 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
21230 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
21240 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
21250 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
21260 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
21270 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
21280 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  c;.}../*.** Ensu
21290 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d  re that the sub-
212a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
212b0 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61  open. If it is a
212c0 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69  lready open, thi
212d0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
212e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
212f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
21300 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
21310 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
21320 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20  ing to plan. An 
21330 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
21340 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
21350 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
21360 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
21370 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69  OsOpen() .** fai
21380 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
21390 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
213a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
213b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
213c0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73  TE_OK;.  if( !is
213d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
213e0 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  d) ){.    if( pP
213f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
21400 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
21410 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70  MODE_MEMORY || p
21420 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
21430 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ory ){.      sql
21440 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
21450 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
21460 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21470 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
21480 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
21490 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49  ager->sjfd, SQLI
214a0 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
214b0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  AL);.    }.  }. 
214c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
214d0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65  *.** Append a re
214e0 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72  cord of the curr
214f0 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67  ent state of pag
21500 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62  e pPg to the sub
21510 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74  -journal. .** It
21520 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
21530 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74  responsibility t
21540 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72  o use subjRequir
21550 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63  esPage() to chec
21560 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  k .** that it is
21570 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
21580 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
21590 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
215a0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
215b0 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
215c0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
215d0 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
215e0 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
215f0 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
21600 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
21610 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
21620 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
21630 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
21640 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
21650 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
21660 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
21670 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
21680 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
21690 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
216a0 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
216b0 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
216c0 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
216d0 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
216e0 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
216f0 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
21700 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
21710 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
21720 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21730 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
21740 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
21750 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  r;.  if( pPager-
21760 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
21770 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21780 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  OFF ){..    /* O
21790 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
217a0 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e  nal, if it has n
217b0 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
217c0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73  opened */.    as
217d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
217e0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
217f0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
21800 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
21810 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
21820 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
21830 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
21840 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  >sjfd) || pPager
21850 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a  ->nSubRec==0 );.
21860 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
21870 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21880 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
21890 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
218a0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67  .         || pPg
218b0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
218c0 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29  bOrigSize .    )
218d0 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  ;.    rc = openS
218e0 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
218f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
21900 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61  e sub-journal wa
21910 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73  s opened success
21920 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c  fully (or was al
21930 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20  ready open),.   
21940 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f   ** write the jo
21950 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74  urnal record int
21960 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  o the file.  */.
21970 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76  TE_OK ){.      v
21990 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
219a0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69  ->pData;.      i
219b0 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67  64 offset = pPag
219c0 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70  er->nSubRec*(4+p
219d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
219e0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  ;.      char *pD
219f0 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43  ata2;.  .      C
21a00 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
21a10 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
21a20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
21a30 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
21a40 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
21a50 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
21a60 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
21a70 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
21a80 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
21a90 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
21aa0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
21ab0 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
21ac0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
21ad0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21ae0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
21af0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
21b00 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
21b10 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
21b20 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
21b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21b40 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
21b50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
21b60 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
21b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21b80 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
21b90 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
21ba0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
21bb0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
21bc0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
21bd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21be0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21bf0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
21c00 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
21c10 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
21c20 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
21c30 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
21c40 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
21c50 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
21c60 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
21c70 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
21c80 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
21c90 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
21ca0 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
21cb0 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
21cc0 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
21cd0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
21ce0 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
21cf0 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
21d00 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
21d10 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
21d20 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
21d30 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
21d40 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
21d50 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
21d60 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
21d70 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
21d80 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
21d90 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
21da0 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
21db0 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
21dc0 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
21dd0 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
21de0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21df0 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
21e00 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
21e10 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
21e20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
21e30 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
21e40 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
21e50 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
21e60 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
21e70 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
21e80 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
21e90 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
21ea0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
21eb0 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
21ec0 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
21ed0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
21ee0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
21ef0 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
21f00 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
21f10 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
21f20 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
21f30 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
21f40 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
21f50 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
21f60 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
21f70 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
21f80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
21f90 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
21fa0 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
21fb0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
21fc0 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
21fd0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
21fe0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
21ff0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
22000 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
22010 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
22020 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20  GHDR_DIRTY );.. 
22030 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e   /* The doNotSyn
22040 63 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73  cSpill flag is s
22050 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20  et during times 
22060 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e  when doing a syn
22070 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  c of.  ** journa
22080 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20  l (and adding a 
22090 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e  new header) is n
220a0 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69  ot allowed.  Thi
220b0 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  s occurs.  ** du
220c0 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71  ring calls to sq
220d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
220e0 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  ) while trying t
220f0 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70  o journal multip
22100 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65  le.  ** pages be
22110 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73  longing to the s
22120 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a  ame sector..  **
22130 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  ** The doNotS
22140 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69  pill flag inhibi
22150 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69  ts all cache spi
22160 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  lling regardless
22170 20 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a   of whether.  **
22180 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69   or not a sync i
22190 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69  s required.  Thi
221a0 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  s is set during 
221b0 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  a rollback..  **
221c0 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69  .  ** Spilling i
221d0 73 20 61 6c 73 6f 20 69 6e 68 69 62 69 74 65 64  s also inhibited
221e0 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
221f0 72 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  r state..  */.  
22200 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
22210 6f 64 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ode ) return SQL
22220 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
22230 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
22240 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
22250 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
22260 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
22270 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  l && (pPg->flags
22280 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
22290 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  NC)!=0 ){.    re
222a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
222b0 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72    }..  pPg->pDir
222c0 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61  ty = 0;.  if( pa
222d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
222e0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74  ) ){.    /* Writ
222f0 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65  e a single frame
22300 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74   for this page t
22310 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20  o the log. */.  
22320 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
22330 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a  esPage(pPg) ){ .
22340 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
22350 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20  urnalPage(pPg); 
22360 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
22370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22380 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
22390 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
223a0 2c 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b  , pPg, 0, 0, 0);
223b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
223c0 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
223d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
223e0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
223f0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
22400 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
22410 4e 43 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  NC ){.      asse
22420 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  rt( !pPager->noS
22430 79 6e 63 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ync );.      rc 
22440 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
22450 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
22460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22470 26 20 0a 20 20 20 20 20 20 20 20 21 28 70 50 61  & .        !(pPa
22480 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
22490 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
224a0 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20  ODE_MEMORY) &&. 
224b0 20 20 20 20 20 20 20 21 28 73 71 6c 69 74 65 33         !(sqlite3
224c0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
224d0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
224e0 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
224f0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20  _SAFE_APPEND).  
22500 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
22510 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
22520 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
22530 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
22540 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
22550 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
22560 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
22570 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69  r of this page i
22580 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
22590 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
225a0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  f.    ** the dat
225b0 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20  abase image, it 
225c0 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77  may need to be w
225d0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75  ritten to the su
225e0 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  b-journal..    *
225f0 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
22600 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61  e the call to pa
22610 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
22620 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20  st() below will 
22630 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61  not.    ** actua
22640 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74  lly write data t
22650 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68  o the file in th
22660 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a  is case..    **.
22670 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20      ** Consider 
22680 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
22690 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73  quence of events
226a0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
226b0 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20    BEGIN;.    ** 
226c0 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
226d0 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X>.    **     
226e0 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a  <modify page X>.
226f0 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50      **     SAVEP
22700 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20  OINT sp;.    ** 
22710 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61        <shrink da
22720 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59  tabase file to Y
22730 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20   pages>.    **  
22740 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73 73       pagerStress
22750 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20  (page X).    ** 
22760 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
22770 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sp;.    **.    *
22780 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e  * If (X>Y), then
22790 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73   when pagerStres
227a0 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65  s is called page
227b0 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77   X will not be w
227c0 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75  ritten.    ** ou
227d0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
227e0 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c  e file, but will
227f0 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
22800 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e   the cache. Then
22810 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  ,.    ** followi
22820 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  ng the "ROLLBACK
22830 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e   TO sp" statemen
22840 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  t, reading page 
22850 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20  X will read.    
22860 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
22870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22880 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  This will be the
22890 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20   copy of page X 
228a0 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73  as it.    ** was
228b0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
228c0 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e  ction started, n
228d0 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ot as it was whe
228e0 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22  n "SAVEPOINT sp"
228f0 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63  .    ** was exec
22900 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uted..    **.   
22910 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
22920 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65   is to write the
22930 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f   current data fo
22940 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68  r page X into th
22950 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f  e .    ** sub-jo
22960 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28  urnal file now (
22970 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
22980 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20  eady there), so 
22990 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20  that it will.   
229a0 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20   ** be restored 
229b0 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  to its current v
229c0 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52  alue when the "R
229d0 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69  OLLBACK TO sp" i
229e0 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74  s .    ** execut
229f0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
22a00 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20  f( NEVER(.      
22a10 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
22a20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  && pPg->pgno>pPa
22a30 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73  ger->dbSize && s
22a40 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
22a50 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20  pPg).    ) ){.  
22a60 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
22a70 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
22a80 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72    }.  .    /* Wr
22a90 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
22aa0 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74   of the page out
22ab0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
22ac0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
22ad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22ae0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
22af0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
22b00 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
22b10 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
22b20 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
22b30 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
22b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
22b50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
22b60 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
22b70 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
22b80 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
22b90 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
22ba0 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
22bb0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
22bc0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
22bd0 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  r, rc);.}.../*.*
22be0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
22bf0 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
22c00 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
22c10 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
22c20 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
22c30 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
22c40 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
22c50 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
22c60 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
22c70 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
22c80 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
22c90 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
22ca0 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
22cb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22cc0 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
22cd0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
22ce0 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
22cf0 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
22d00 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
22d10 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
22d20 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
22d30 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
22d40 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
22d50 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
22d60 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
22d70 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
22d80 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
22d90 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
22da0 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
22db0 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
22dc0 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
22dd0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
22de0 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
22df0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
22e00 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
22e10 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
22e20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
22e30 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
22e40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
22e50 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
22e60 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
22e70 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
22e80 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
22e90 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
22ea0 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
22eb0 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
22ec0 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
22ed0 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
22ee0 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
22ef0 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
22f00 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
22f10 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
22f20 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
22f30 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
22f40 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
22f50 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
22f60 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
22f70 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  ER_OMIT_JOURNAL 
22f80 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  and PAGER_NO_REA
22f90 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a  DLOCK flags..**.
22fa0 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
22fb0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
22fc0 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
22fd0 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
22fe0 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
22ff0 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
23000 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
23010 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
23020 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
23030 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
23040 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
23050 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
23060 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
23070 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
23080 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
23090 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
230a0 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
230b0 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
230c0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
230d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
230e0 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
230f0 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
23100 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
23110 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
23120 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
23130 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
23140 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
23150 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
23160 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
23170 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
23180 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
23190 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
231a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
231b0 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
231c0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
231d0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
231e0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
231f0 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
23200 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
23210 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
23220 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
23230 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
23240 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
23250 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
23260 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23270 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
23280 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
23290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
232a0 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
232b0 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
232c0 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
232d0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
232e0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
232f0 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
23300 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
23310 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
23320 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
23330 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
23340 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
23350 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
23360 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
23370 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
23380 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
23390 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
233a0 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
233b0 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
233c0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
233d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
233e0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
233f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
23400 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
23410 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
23420 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
23430 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
23440 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
23450 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
23460 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
23470 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
23480 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
23490 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
234a0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
234b0 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
234c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
234d0 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
234e0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
234f0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
23500 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
23510 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
23520 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
23530 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
23540 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
23550 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
23560 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
23570 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
23580 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23590 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
235a0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
235b0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
235c0 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
235d0 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
235e0 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
235f0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
23600 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
23610 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
23620 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a  EADLOCK)!=0;  /*
23630 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65   True to omit re
23640 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  ad-lock */.  int
23650 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
23660 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
23670 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
23680 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
23690 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31  r PCache */.  u1
236a0 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  6 szPageDflt = S
236b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
236c0 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
236d0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
236e0 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
236f0 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
23700 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
23710 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
23720 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20  ile-handle.  ** 
23730 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f  (there are two o
23740 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e  f them, the main
23750 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
23760 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54   sub-journal). T
23770 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  his.  ** is the 
23780 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65  maximum space re
23790 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e  quired for an in
237a0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
237b0 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a  file handle .  *
237c0 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20  * and a regular 
237d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
237e0 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61  dle. Note that a
237f0 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61   "regular journa
23800 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d  l-handle".  ** m
23810 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20  ay be a wrapper 
23820 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69  capable of cachi
23830 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72  ng the first por
23840 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
23850 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  nal.  ** file in
23860 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65   memory to imple
23870 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d  ment the atomic-
23880 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
23890 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f  on (see .  ** so
238a0 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61  urce file journa
238b0 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  l.c)..  */.  if(
238c0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
238d0 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65  ize(pVfs)>sqlite
238e0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
238f0 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  ) ){.    journal
23900 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
23910 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
23920 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d  Size(pVfs));.  }
23930 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  else{.    journa
23940 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
23950 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  D8(sqlite3MemJou
23960 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d  rnalSize());.  }
23970 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
23980 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
23990 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61  o NULL in case a
239a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
239b0 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
239c0 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  0;..  /* Compute
239d0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
239e0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
239f0 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
23a00 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
23a10 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
23a20 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
23a30 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
23a40 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
23a50 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
23a60 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
23a70 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
23a80 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
23a90 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
23aa0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
23ab0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
23ac0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
23ad0 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
23ae0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
23af0 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20  (nPathname*2);. 
23b00 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
23b10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
23b20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
23b30 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
23b40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
23b50 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
23b60 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
23b70 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
23b80 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
23b90 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
23ba0 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  [0] = 0;.    }el
23bb0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
23bc0 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b        zPathname[
23bd0 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20  0] = 0; /* Make 
23be0 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  sure initialized
23bf0 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74   even if FullPat
23c00 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f  hname() fails */
23c10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23c20 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
23c30 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
23c40 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
23c50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
23c60 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
23c70 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
23c80 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
23c90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23ca0 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b  OK && nPathname+
23cb0 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  8>pVfs->mxPathna
23cc0 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  me ){.      /* T
23cd0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
23ce0 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  ken when the jou
23cf0 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72  rnal path requir
23d00 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74  ed by.      ** t
23d10 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
23d20 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  g opened will be
23d30 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d   more than pVfs-
23d40 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20  >mxPathname.    
23d50 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65    ** bytes in le
23d60 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73  ngth. This means
23d70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
23d80 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a  nnot be opened,.
23d90 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77        ** as it w
23da0 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
23db0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
23dc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
23dd0 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  even.      ** ch
23de0 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  eck for a hot-jo
23df0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61  urnal before rea
23e00 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ding..      */. 
23e10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23e20 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
23e30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23e40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23e50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23e60 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
23e70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23e80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
23e90 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
23ea0 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
23eb0 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
23ec0 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
23ed0 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
23ee0 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
23ef0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
23f00 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
23f10 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
23f20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
23f30 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
23f40 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
23f50 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
23f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f70 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
23f80 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23f90 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fb0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
23fc0 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
23fd0 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
23fe0 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
23ff0 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
24000 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
24010 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
24020 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
24030 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
24040 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
24050 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
24060 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
24070 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
24080 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
24090 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
240a0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
240b0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
240c0 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
240d0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
240e0 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
240f0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
24100 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
24110 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
24120 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
24130 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
24140 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
24150 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
24160 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
24170 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
24180 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
24190 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
241a0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
241b0 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
241c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
241d0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
241e0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
241f0 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
24200 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
24210 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
24220 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24240 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
24250 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
24260 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20   + 1            
24270 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
24280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24290 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e  OMIT_WAL.    + n
242a0 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 31  Pathname + 4 + 1
242b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
242c0 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a   zWal */.#endif.
242d0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45    );.  assert( E
242e0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
242f0 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ENT(SQLITE_INT_T
24300 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c  O_PTR(journalFil
24310 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28  eSize)) );.  if(
24320 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71   !pPtr ){.    sq
24330 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
24340 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
24350 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
24360 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20    }.  pPager =  
24370 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67              (Pag
24380 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50  er*)(pPtr);.  pP
24390 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20  ager->pPCache = 
243a0 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74     (PCache*)(pPt
243b0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  r += ROUND8(size
243c0 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20  of(*pPager)));. 
243d0 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20   pPager->fd =   
243e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
243f0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
24400 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70  cacheSize));.  p
24410 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73  Pager->sjfd = (s
24420 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
24430 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66  tr += ROUND8(pVf
24440 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20  s->szOsFile));. 
24450 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20   pPager->jfd =  
24460 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
24470 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
24480 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  ileSize);.  pPag
24490 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
244a0 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
244b0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
244c0 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ze);.  assert( E
244d0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
244e0 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ENT(pPager->jfd)
244f0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
24500 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c  n the Pager.zFil
24510 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e  ename and Pager.
24520 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73  zJournal buffers
24530 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  , if required. *
24540 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  /.  if( zPathnam
24550 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
24560 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63  >zJournal =   (c
24570 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50  har*)(pPtr += nP
24580 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20  athname + 1);.  
24590 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
245a0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
245b0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
245c0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
245d0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
245e0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
245f0 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
24600 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
24610 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
24620 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a  "-journal", 8);.
24630 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
24640 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20  zFilename[0]==0 
24650 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
24660 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30  >zJournal[0] = 0
24670 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
24680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
24690 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
246a0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26  pPager->zWal = &
246b0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
246c0 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b  [nPathname+8+1];
246d0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
246e0 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
246f0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
24700 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
24710 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50  &pPager->zWal[nP
24720 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 22  athname], "-wal"
24730 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 4);.    }.#end
24740 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  if.    sqlite3_f
24750 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
24760 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
24770 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
24780 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
24790 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
247a0 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
247b0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
247c0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
247d0 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65  lename[0] && !me
247e0 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  mDb ){.    int f
247f0 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
24800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
24810 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
24820 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
24830 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24840 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
24850 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
24860 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
24870 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
24880 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
24890 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
248a0 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
248b0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
248c0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
248d0 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
248e0 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
248f0 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
24900 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
24910 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
24920 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
24930 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
24940 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
24950 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
24960 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
24970 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
24980 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
24990 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
249a0 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
249b0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
249c0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
249d0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
249e0 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
249f0 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
24a00 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
24a10 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
24a20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24a30 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
24a40 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
24a50 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
24a60 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
24a70 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
24a80 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
24a90 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
24aa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50  );.      if( szP
24ab0 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
24ac0 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
24ad0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
24ae0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
24af0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
24b00 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
24b10 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
24b20 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
24b30 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
24b40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24b50 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
24b60 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70 50 61  eDflt = (u16)pPa
24b70 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
24b80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24b90 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
24ba0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
24bb0 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20  RITE.      {.   
24bc0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
24bd0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
24be0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
24bf0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
24c00 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
24c10 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
24c20 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
24c30 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
24c40 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
24c50 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
24c60 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
24c70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24c80 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
24c90 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
24ca0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  536);.        fo
24cb0 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
24cc0 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
24cd0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
24ce0 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
24cf0 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
24d00 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
24d10 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
24d20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
24d30 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
24d40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24d50 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
24d60 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  f.    }.  }else{
24d70 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
24d80 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
24d90 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
24da0 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
24db0 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
24dc0 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
24dd0 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
24de0 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
24df0 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
24e00 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
24e10 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
24e20 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
24e30 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
24e40 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
24e50 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
24e60 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
24e70 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
24e80 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
24e90 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
24ea0 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
24eb0 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
24ec0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
24ed0 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
24ee0 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
24ef0 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
24f00 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  al..    */ .    
24f10 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
24f20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
24f30 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
24f40 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  E;.    readOnly 
24f50 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  = (vfsFlags&SQLI
24f60 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
24f70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
24f80 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
24f90 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73  to PagerSetPages
24fa0 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20  ize() serves to 
24fb0 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  set the value of
24fc0 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67   .  ** Pager.pag
24fd0 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c  eSize and to all
24fe0 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e  ocate the Pager.
24ff0 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
25000 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
25010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25020 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25030 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20  ->memDb==0 );.  
25040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25050 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
25060 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66  Pager, &szPageDf
25070 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  lt, -1);.    tes
25080 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
25090 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
250a0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
250b0 63 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72  curred in either
250c0 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
250d0 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a  bove, free the .
250e0 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63    ** Pager struc
250f0 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
25100 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
25110 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25120 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
25130 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
25140 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ace );.    sqlit
25150 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
25160 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
25170 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
25180 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
25190 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
251a0 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
251b0 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73  object. */.  ass
251c0 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30  ert( nExtra<1000
251d0 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52   );.  nExtra = R
251e0 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20  OUND8(nExtra);. 
251f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70   sqlite3PcacheOp
25200 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e  en(szPageDflt, n
25210 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20  Extra, !memDb,. 
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25230 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53     !memDb?pagerS
25240 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a  tress:0, (void *
25250 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  )pPager, pPager-
25260 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41  >pPCache);..  PA
25270 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20  GERTRACE(("OPEN 
25280 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
25290 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66  NDLEID(pPager->f
252a0 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  d), pPager->zFil
252b0 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41  ename));.  IOTRA
252c0 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
252d0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
252e0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
252f0 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
25300 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a  urnal = (u8)useJ
25310 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
25320 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  ->noReadlock = (
25330 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
25340 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20  adOnly) ?1:0;.  
25350 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
25360 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
25370 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
25380 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
25390 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
253a0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
253b0 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 28 75 38  bSizeValid = (u8
253c0 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20 70 50 61  )memDb;.  /* pPa
253d0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
253e0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
253f0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
25400 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
25410 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
25420 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
25430 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
25440 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
25450 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
25460 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
25470 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25480 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70  ->state == (temp
25490 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43  File ? PAGER_EXC
254a0 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55  LUSIVE : PAGER_U
254b0 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70  NLOCK) );.  /* p
254c0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
254d0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
254e0 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
254f0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
25500 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
25510 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
25520 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
25530 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
25540 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
25550 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
25560 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
25570 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
25580 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
25590 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
255a0 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
255b0 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
255c0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
255d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
255e0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
255f0 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
25600 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
25610 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
25620 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
25630 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
25640 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
25650 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
25660 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
25670 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
25680 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
25690 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
256a0 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  nc = pPager->noS
256b0 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67  ync ?0:1;.  pPag
256c0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
256d0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
256e0 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  MAL;.  /* pPager
256f0 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
25700 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
25710 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
25720 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
25730 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
25740 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
25750 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20   (u16)nExtra;.  
25760 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
25770 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54  izeLimit = SQLIT
25780 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41  E_DEFAULT_JOURNA
25790 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20  L_SIZE_LIMIT;.  
257a0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
257b0 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65  Pager->fd) || te
257c0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53  mpFile );.  setS
257d0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
257e0 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75  );.  if( !useJou
257f0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67  rnal ){.    pPag
25800 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
25810 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
25820 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65  ODE_OFF;.  }else
25830 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
25840 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
25850 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
25860 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
25870 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
25880 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
25890 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
258a0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
258b0 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  rArg = 0; */.  p
258c0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
258d0 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a   = xReinit;.  /*
258e0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
258f0 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
25900 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
25910 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72  ; */..  *ppPager
25920 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
25930 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25940 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ..../*.** This f
25950 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
25960 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69  d after transiti
25970 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52  oning from PAGER
25980 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41  _UNLOCK to.** PA
25990 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
259a0 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68  . It tests if th
259b0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
259c0 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a  rnal present in.
259d0 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
259e0 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  em for the given
259f0 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f   pager. A hot jo
25a00 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
25a10 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  t .** needs to b
25a20 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41  e played back. A
25a30 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73  ccording to this
25a40 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74   function, a hot
25a50 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
25a60 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66   exists if the f
25a70 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
25a80 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  a are met:.**.**
25a90 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c     * The journal
25aa0 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20   file exists in 
25ab0 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  the file system,
25ac0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70   and.**   * No p
25ad0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
25ae0 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
25af0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
25b00 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
25b10 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  d.**   * The dat
25b20 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
25b30 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  f is greater tha
25b40 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 0 bytes in siz
25b50 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
25b60 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
25b70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25b80 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
25b90 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49  ot 0x00..**.** I
25ba0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
25bb0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
25bc0 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
25bd0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
25be0 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
25bf0 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
25c00 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
25c10 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
25c20 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
25c30 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
25c40 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
25c50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25c60 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74  is.** just delet
25c70 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74  ed using OsDelet
25c80 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  e, *pExists is s
25c90 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
25ca0 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
25cb0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
25cc0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
25cd0 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65  t check if there
25ce0 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   is a master jou
25cf0 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a  rnal filename.**
25d00 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
25d10 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
25d20 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d  e is, and that m
25d30 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
25d40 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  le.** does not e
25d50 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a  xist, then the j
25d60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
25d70 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49  ot really hot. I
25d80 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74  n this.** case t
25d90 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
25da0 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d   return a false-
25db0 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61  positive. The pa
25dc0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a  ger_playback().*
25dd0 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  * routine will d
25de0 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
25df0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
25e00 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
25e10 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  and .** will not
25e20 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a   roll it back. .
25e30 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a  **.** If a hot-j
25e40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
25e50 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a  ound to exist, *
25e60 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
25e70 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  o 1 and .** SQLI
25e80 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
25e90 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  If no hot-journa
25ea0 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
25eb0 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a  t, *pExists is.*
25ec0 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  * set to 0 and S
25ed0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
25ee0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
25ef0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
25f00 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65  rying.** to dete
25f10 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
25f20 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   not a hot-journ
25f30 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
25f40 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20  the IO error.** 
25f50 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
25f60 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
25f70 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e  f *pExists is un
25f80 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
25f90 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
25fa0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
25fb0 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
25fc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
25fd0 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
25fe0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
25ff0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26000 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  OK;           /*
26010 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
26020 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31    int exists = 1
26030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26040 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75  /* True if a jou
26050 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
26060 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72  sent */.  int jr
26070 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65  nlOpen = !!isOpe
26080 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
26090 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
260a0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
260b0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
260c0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
260d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
260e0 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
260f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
26100 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  <= PAGER_SHARED 
26110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e  );.  assert( jrn
26120 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71  lOpen==0 || ( sq
26130 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
26140 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
26150 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20  ger->jfd) &.    
26160 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
26170 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
26180 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78  EN.  ));..  *pEx
26190 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  ists = 0;.  if( 
261a0 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
261b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
261c0 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
261d0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
261e0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
261f0 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
26200 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
26210 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
26220 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65  ){.    int locke
26230 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
26240 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
26250 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
26260 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
26270 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65   */..    /* Race
26280 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a   condition here:
26290 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73    Another proces
262a0 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  s might have bee
262b0 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  n holding the.  
262c0 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45    ** the RESERVE
262d0 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20  D lock and have 
262e0 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61  a journal open a
262f0 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41  t the sqlite3OsA
26300 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20  ccess() .    ** 
26310 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20  call above, but 
26320 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
26330 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70  journal and drop
26340 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65   the lock before
26350 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74  .    ** we get t
26360 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
26370 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
26380 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c  servedLock() cal
26390 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20  l.  If that.    
263a0 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  ** is the case, 
263b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
263c0 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69  ht think there i
263d0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
263e0 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66  when.    ** in f
263f0 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e  act there is non
26400 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73  e.  This results
26410 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69   in a false-posi
26420 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a  tive which will.
26430 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
26440 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79  with by the play
26450 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54  back routine.  T
26460 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20  icket #3883..   
26470 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
26480 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
26490 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
264a0 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
264b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
264c0 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
264d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
264e0 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  e;..      /* Che
264f0 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ck the size of t
26500 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26510 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73  . If it consists
26520 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20   of 0 pages,.   
26530 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74     ** then delet
26540 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
26550 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64  le. See the head
26560 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  er comment above
26570 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74   for .      ** t
26580 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72  he reasoning her
26590 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f  e.  Delete the o
265a0 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
265b0 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20  file under.     
265c0 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c   ** a RESERVED l
265d0 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63  ock to avoid rac
265e0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64  e conditions and
265f0 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74   to avoid violat
26600 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33  ing.      ** [H3
26610 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a  3020]..      */.
26620 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26630 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
26640 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
26650 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
26660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26670 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
26680 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
26690 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
266a0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
266b0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
266c0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
266d0 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  d, RESERVED_LOCK
266e0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
266f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26700 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
26710 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
26720 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
26730 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
26740 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
26750 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
26760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26770 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
26780 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
26790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
267a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
267b0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
267c0 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
267d0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
267e0 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
267f0 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
26800 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
26810 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
26820 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
26830 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
26840 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
26850 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
26860 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
26870 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
26880 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
26890 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
268a0 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
268b0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
268c0 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
268d0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
268e0 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
268f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26900 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
26910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
26920 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
26930 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
26940 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
26950 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
26960 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26970 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
26980 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
26990 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
269a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
269b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
269c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
269d0 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
269e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
269f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26a00 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
26a10 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
26a20 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
26a30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26a40 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
26a50 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
26a60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26a70 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
26a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26a90 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
26aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26ab0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
26ac0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
26ad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26ae0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
26af0 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
26b00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
26b10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
26b20 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
26b30 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
26b40 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
26b50 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
26b60 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
26b70 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
26b80 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20     ** its has a 
26b90 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
26ba0 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
26bb0 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
26bc0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
26bd0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
26be0 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
26bf0 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
26c00 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
26c10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
26c20 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
26c30 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
26c40 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
26c50 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
26c60 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
26c70 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
26c80 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
26c90 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
26cb0 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
26cc0 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
26cd0 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
26ce0 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
26cf0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
26d00 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
26d10 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
26d20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
26d30 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
26d40 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
26d50 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
26d60 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
26d70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26d80 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
26d90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
26da0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
26db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
26dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26dd0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
26de0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
26df0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
26e00 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
26e10 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
26e20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26e30 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
26e40 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
26e50 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
26e60 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
26e70 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
26e80 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
26e90 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
26ea0 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
26eb0 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
26ec0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
26ed0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
26ee0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
26ef0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
26f00 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
26f10 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
26f20 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
26f30 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
26f40 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
26f50 6c 79 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  ly in PAGER_UNLO
26f60 43 4b 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63  CK state (no loc
26f70 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f  k held.**      o
26f80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26f90 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74  ile), then an at
26fa0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
26fb0 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20   obtain a.**    
26fc0 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e    SHARED lock on
26fd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26fe0 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  le. Immediately 
26ff0 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a  after obtaining.
27000 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52  **      the SHAR
27010 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c  ED lock, the fil
27020 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63  e-system is chec
27030 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ked for a hot-jo
27040 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77  urnal,.**      w
27050 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62  hich is played b
27060 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20  ack if present. 
27070 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f  Following any ho
27080 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20  t-journal .**   
27090 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65     rollback, the
270a0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
270b0 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64   cache are valid
270c0 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67  ated by checking
270d0 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68  .**      the 'ch
270e0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69  ange-counter' fi
270f0 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  eld of the datab
27100 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20  ase file header 
27110 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63  and.**      disc
27120 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72  arded if they ar
27130 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e  e found to be in
27140 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  valid..**.**   2
27150 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
27160 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
27170 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64  lusive-mode, and
27180 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
27190 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20  ntly.**      no 
271a0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
271b0 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61  rences to any pa
271c0 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74  ges, and is in t
271d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a  he error state,.
271e0 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20  **      then an 
271f0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
27200 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  to clear the err
27210 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63  or state by disc
27220 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  arding.**      t
27230 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
27240 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  he page cache an
27250 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  d rolling back a
27260 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a  ny open journal.
27270 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a  **      file..**
27280 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61  .** If the opera
27290 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62  tion described b
272a0 79 20 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e  y (2) above is n
272b0 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e  ot attempted, an
272c0 64 20 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d if the.** page
272d0 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  r is in an error
272e0 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
272f0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68  n SQLITE_FULL wh
27300 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
27310 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
27320 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
27330 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74   is returned. It
27340 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f   is permitted to
27350 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74   read the.** dat
27360 61 62 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51  abase when in SQ
27370 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20  LITE_FULL error 
27380 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  state..**.** Oth
27390 65 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79  erwise, if every
273a0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
273b0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
273c0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
273d0 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63  n.** IO error oc
273e0 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69  curs while locki
273f0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ng the database,
27400 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20   checking for a 
27410 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
27420 69 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  ile or rolling b
27430 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
27440 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  le, the IO error
27450 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
27460 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
27470 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
27480 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
27490 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
274a0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
274b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
274c0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  code */.  int is
274d0 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 20  ErrorReset = 0; 
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
274f0 54 72 75 65 20 69 66 20 72 65 63 6f 76 65 72 69  True if recoveri
27500 6e 67 20 66 72 6f 6d 20 65 72 72 6f 72 20 73 74  ng from error st
27510 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ate */..  /* Thi
27520 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
27530 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d  y called from b-
27540 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68  tree and only wh
27550 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  en there are no.
27560 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67    ** outstanding
27570 20 70 61 67 65 73 20 2a 2f 0a 20 20 61 73 73 65   pages */.  asse
27580 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
27590 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
275a0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
275b0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d  .  if( NEVER(MEM
275c0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  DB && pPager->er
275d0 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e  rCode) ){ return
275e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
275f0 3b 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  ; }..  /* If thi
27600 73 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  s database is in
27610 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   an error-state,
27620 20 6e 6f 77 20 69 73 20 61 20 63 68 61 6e 63 65   now is a chance
27630 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74   to clear.  ** t
27640 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72  he error. Discar
27650 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
27660 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
27670 65 20 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 0a 20  e and rollback. 
27680 20 2a 2a 20 61 6e 79 20 68 6f 74 20 6a 6f 75 72   ** any hot jour
27690 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  nal in the file-
276a0 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69  system..  */.  i
276b0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
276c0 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  de ){.    if( is
276d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
276e0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ) || pPager->zJo
276f0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
27700 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b  sErrorReset = 1;
27710 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
27720 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
27730 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65  ITE_OK;.    page
27740 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
27750 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
27760 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
27770 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
27780 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
27790 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
277a0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
277b0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
277c0 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72 72 6f  UNLOCK || isErro
277d0 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 73 71  rReset ){.    sq
277e0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
277f0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
27800 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 69  >pVfs;.    int i
27810 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sHotJournal = 0;
27820 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
27830 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MDB );.    asser
27840 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
27850 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
27860 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
27870 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
27880 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20  noReadlock ){.  
27890 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
278a0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  er->readOnly );.
278b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
278c0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
278d0 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ED;.    }else{. 
278e0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
278f0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
27900 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
27910 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
27920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
27940 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
27950 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
27960 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
27970 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
27980 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
27990 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
279a0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48  Pager->state>=SH
279b0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
279c0 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
279d0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
279e0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
279f0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
27a00 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
27a10 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
27a20 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
27a30 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
27a40 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
27a50 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 45   */.    if( !isE
27a60 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20  rrorReset ){.   
27a70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27a80 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45  r->state <= PAGE
27a90 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
27aa0 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
27ab0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73  rnal(pPager, &is
27ac0 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  HotJournal);.   
27ad0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27ae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27af0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
27b00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
27b10 66 28 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  f( isErrorReset 
27b20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20  || isHotJournal 
27b30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ){.      /* Get 
27b40 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
27b50 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
27b60 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
27b70 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
27b80 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
27b90 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
27ba0 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
27bb0 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
27bc0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45  o the.      ** E
27bd0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
27be0 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
27bf0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
27c00 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
27c10 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
27c20 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
27c30 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
27c40 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
27c50 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
27c60 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
27c70 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
27c80 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
27c90 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20  rolling the .   
27ca0 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
27cb0 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  l back..      **
27cc0 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75   .      ** Becau
27cd0 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
27ce0 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
27cf0 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
27d00 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  ed, any.      **
27d10 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
27d20 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63  ttempting to acc
27d30 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
27d40 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74   file will get t
27d50 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
27d60 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
27d70 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f  de and fail to o
27d80 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
27d90 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20  CLUSIVE lock .  
27da0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61      ** on the da
27db0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
27dc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
27dd0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58  pPager->state<EX
27de0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
27df0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27e00 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
27e10 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
27e20 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
27e30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27e40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
27e50 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
27e60 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
27e70 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
27e80 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
27e90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
27ea0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
27eb0 55 53 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20  USIVE;.      }. 
27ec0 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  .      /* Open t
27ed0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
27ee0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
27ef0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
27f00 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65  e in .      ** e
27f10 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
27f20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65  mode the file de
27f30 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
27f40 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20   kept open and. 
27f50 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79       ** possibly
27f60 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
27f70 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
27f80 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  . On some system
27f90 73 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  s, the.      ** 
27fa0 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c  OsTruncate() cal
27fb0 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73  l used in exclus
27fc0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
27fd0 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20  also requires.  
27fe0 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
27ff0 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
28000 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
28010 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
28020 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
28030 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
28040 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28050 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 70  3OsAccess(pVfs,p
28060 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
28070 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
28080 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20  ISTS,&res);.    
28090 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
280a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
280b0 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
280c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
280d0 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
280e0 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
280f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
28100 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
28110 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
28120 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28130 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
28140 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
28150 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
28160 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
28170 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
28180 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
28190 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
281a0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
281b0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
281c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
281d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
281e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
281f0 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
28200 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
28210 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
28220 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
28230 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
28240 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
28250 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
28260 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
28270 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
28280 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
28290 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64  If the journal d
282a0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69  oes not exist, i
282b0 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20  t usually means 
282c0 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20  that some .     
282d0 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
282e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
282f0 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
28300 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
28310 66 6f 72 65 20 0a 20 20 20 20 20 20 20 20 20 20  fore .          
28320 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63    ** this connec
28330 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68  tion obtained th
28340 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
28350 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a   above. Or, it .
28360 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
28370 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65  ay mean that the
28380 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68   pager was in th
28390 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
283a0 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  en this.        
283b0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
283c0 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74  was called and t
283d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
283e0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
283f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
28400 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
28410 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
28420 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
28430 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28440 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
28450 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28460 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
28470 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
28480 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65      /* Reset the
28490 20 6a 6f 75 72 6e 61 6c 20 73 74 61 74 75 73 20   journal status 
284a0 66 69 65 6c 64 73 20 74 6f 20 69 6e 64 69 63 61  fields to indica
284b0 74 65 73 20 74 68 61 74 20 77 65 20 68 61 76 65  tes that we have
284c0 20 6e 6f 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c   no.      ** rol
284d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 74  lback journal at
284e0 20 74 68 69 73 20 74 69 6d 65 2e 20 2a 2f 0a 20   this time. */. 
284f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
28500 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
28510 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
28520 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
28530 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
28540 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
28550 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
28560 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
28570 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
28580 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28590 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
285a0 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 0a 20 20  to disk. */. .  
285b0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
285c0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
285d0 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
285e0 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
285f0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
28600 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
28610 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
28620 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
28630 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
28640 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
28650 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
28660 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
28670 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
28680 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
28690 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20  ache.  Sync the 
286a0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot journal befo
286b0 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20  re playing.     
286c0 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63   ** it back sinc
286d0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  e the process th
286e0 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c  at crashed and l
286f0 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  eft the hot jour
28700 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  nal.      ** pro
28710 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79  bably did not sy
28720 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65  nc it and we are
28730 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77   required to alw
28740 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a  ays sync.      *
28750 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  * the journal be
28760 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20  fore playing it 
28770 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  back..      */. 
28780 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
28790 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
287a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
287b0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
287c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
287d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
287e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
287f0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
28800 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
28810 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28820 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28830 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28840 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
28850 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
28860 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
28870 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
28880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
28890 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
288a0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
288b0 52 45 44 29 0a 20 20 20 20 20 20 20 20 20 20 20  RED).           
288c0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
288d0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
288e0 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
288f0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 29  _SHARED).      )
28900 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
28910 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
28920 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68   || sqlite3Pcach
28930 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
28940 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
28950 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
28960 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
28970 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
28980 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
28990 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
289a0 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
289b0 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
289c0 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
289d0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a  previous.      *
289e0 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
289f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43  transaction).  C
28a00 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
28a10 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
28a20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
28a30 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
28a40 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
28a50 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
28a60 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
28a70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
28a80 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
28a90 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
28aa0 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
28ab0 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
28ac0 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
28ad0 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
28ae0 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
28af0 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
28b00 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  tes are.      **
28b10 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
28b20 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
28b30 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
28b40 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
28b50 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
28b60 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
28b70 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
28b80 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
28b90 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
28ba0 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a   in use..      *
28bb0 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  * .      ** Ther
28bc0 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
28bd0 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
28be0 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
28bf0 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
28c00 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
28c10 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
28c20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
28c30 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
28c40 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  at.      ** it c
28c50 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
28c60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
28c70 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20  int nPage = 0;. 
28c80 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
28c90 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
28ca0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
28cb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
28cc0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
28cd0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 0a  ager, &nPage);..
28ce0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
28cf0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
28d00 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72       rc = pPager
28d10 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
28d20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
28d30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
28d40 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
28d50 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
28d60 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
28d70 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
28d80 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
28d90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28da0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
28db0 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
28dc0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
28dd0 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
28de0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28df0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28e00 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
28e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
28e30 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
28e40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
28e50 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
28e60 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
28e70 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
28e80 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
28e90 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
28ea0 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
28eb0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
28ec0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
28ed0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
28ee0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
28ef0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
28f00 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
28f10 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
28f20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
28f30 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74   a WAL file in t
28f40 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
28f50 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61  open this databa
28f60 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a  se in WAL.    **
28f70 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   mode. Otherwise
28f80 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
28f90 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73  function call is
28fa0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f   a no-op..    */
28fb0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
28fc0 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
28fd0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 66  pPager);.  }.. f
28fe0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
28ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29000 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    /* pager_unloc
29010 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
29020 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  or exclusive mod
29030 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  e and in-memory 
29040 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20  databases. */.  
29050 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
29060 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
29070 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29080 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
29090 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
290a0 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
290b0 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
290c0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
290d0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
290e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
290f0 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
29100 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
29110 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
29120 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
29130 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
29140 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
29150 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
29160 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
29170 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
29180 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
29190 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
291a0 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
291b0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
291c0 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
291d0 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33  {.  if( (sqlite3
291e0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
291f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
29200 3d 30 29 0a 20 20 20 26 26 20 28 21 70 50 61 67  =0).   && (!pPag
29210 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
29220 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
29230 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b  rnalOff>0) .  ){
29240 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
29250 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
29260 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
29270 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65  * Acquire a refe
29280 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75  rence to page nu
29290 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67  mber pgno in pag
292a0 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67  er pPager (a pag
292b0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68  e.** reference h
292c0 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29  as type DbPage*)
292d0 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
292e0 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ed reference is 
292f0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
29300 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73   obtained, it is
29310 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61   copied to *ppPa
29320 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
29330 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
29340 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
29350 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
29360 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
29370 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
29380 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
29390 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
293a0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
293b0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
293c0 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
293d0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
293e0 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
293f0 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
29400 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
29410 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
29420 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
29430 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
29440 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
29450 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
29460 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
29470 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
29480 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
29490 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
294a0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
294b0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
294c0 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
294d0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
294e0 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
294f0 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
29500 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
29510 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
29520 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
29530 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
29540 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
29550 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
29560 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
29570 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
29580 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
29590 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
295a0 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
295b0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
295c0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
295d0 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
295e0 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
295f0 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
29600 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
29610 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
29620 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
29630 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
29640 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
29650 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
29660 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
29670 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
29680 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
29690 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
296a0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
296b0 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
296c0 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
296d0 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
296e0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
296f0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
29700 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
29710 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
29720 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65  occurs in two se
29730 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73  perate scenarios
29740 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
29750 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
29760 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
29770 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
29780 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
29790 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
297a0 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
297b0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
297c0 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
297d0 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
297e0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
297f0 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20   be filled with 
29800 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a  the data read.**
29810 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73        from the s
29820 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  avepoint journal
29830 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  ..**.** If noCon
29840 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68  tent is true, th
29850 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75  en the data retu
29860 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69  rned is zeroed i
29870 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69  nstead of.** bei
29880 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ng read from the
29890 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
298a0 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74  ionally, the bit
298b0 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  s corresponding.
298c0 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61  ** to pgno in Pa
298d0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28  ger.pInJournal (
298e0 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  bitvec of pages 
298f0 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20  already written 
29900 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  to the.** journa
29910 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
29920 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
29930 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
29940 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a  ecs of any open.
29950 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ** savepoints ar
29960 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e  e set. This mean
29970 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  s if the page is
29980 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61   made writable a
29990 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69  t any.** point i
299a0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73  n the future, us
299b0 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ing a call to sq
299c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
299d0 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ), its contents.
299e0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a  ** will not be j
299f0 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73  ournaled. This s
29a00 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54  aves IO..**.** T
29a10 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
29a20 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
29a30 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
29a40 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
29a50 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
29a60 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29a70 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
29a80 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
29a90 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
29aa0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  o sqlite3PagerLo
29ab0 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
29ac0 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c  is routine and L
29ad0 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
29ae0 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
29af0 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
29b00 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
29b10 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
29b20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
29b30 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
29b40 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
29b50 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
29b60 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70  n whereas Lookup
29b70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
29b80 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
29b90 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
29ba0 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
29bb0 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
29bc0 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
29bd0 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
29be0 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
29bf0 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
29c00 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c  sary..** Since L
29c10 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
29c20 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
29c30 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
29c40 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
29c50 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
29c60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
29c70 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
29c80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
29c90 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
29ca0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
29cb0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
29cc0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
29cd0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
29ce0 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
29cf0 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
29d00 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
29d10 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
29d20 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
29d30 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
29d40 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
29d50 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
29d60 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
29d70 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
29d80 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
29d90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  ;..  assert( ass
29da0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
29db0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
29dc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
29dd0 74 65 3e 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  te>PAGER_UNLOCK 
29de0 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  );..  if( pgno==
29df0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
29e00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29e10 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
29e20 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
29e30 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
29e40 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
29e50 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  or immediately. 
29e60 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
29e70 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67   request the pag
29e80 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68  e from the PCach
29e90 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66  e layer. */.  if
29ea0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
29eb0 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  e!=SQLITE_OK && 
29ec0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
29ed0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
29ee0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
29ef0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
29f00 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
29f10 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
29f20 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
29f30 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29  pgno, 1, ppPage)
29f40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
29f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29f60 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
29f70 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
29f80 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
29f90 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
29fa0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
29fb0 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
29fc0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
29fd0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
29fe0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
29ff0 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
2a000 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
2a010 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
2a020 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
2a030 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
2a040 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
2a050 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
2a060 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
2a070 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
2a080 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
2a090 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
2a0a0 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  || (*ppPage)->pP
2a0b0 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ager==0 );..  if
2a0c0 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
2a0d0 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e  ger && !noConten
2a0e0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
2a0f0 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61  his case the pca
2a100 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  che already cont
2a110 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ains an initiali
2a120 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20  zed copy of.    
2a130 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74  ** the page. Ret
2a140 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74  urn without furt
2a150 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20  her ado.  */.   
2a160 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50   assert( pgno<=P
2a170 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26  AGER_MAX_PGNO &&
2a180 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f   pgno!=PAGER_MJ_
2a190 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
2a1a0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
2a1b0 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20  Pager->nHit);.  
2a1c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a1d0 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
2a1e0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
2a1f0 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
2a200 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
2a210 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
2a220 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
2a230 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20  tialized.  */.  
2a240 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20 20 20    int nMax;..   
2a250 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
2a260 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
2a270 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20  pPg = *ppPage;. 
2a280 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
2a290 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a   pPager;..    /*
2a2a0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
2a2b0 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
2a2c0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
2a2d0 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67  CORRUPT if a pag
2a2e0 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
2a2f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
2a300 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64  s, or the unused
2a310 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69   locking-page, i
2a320 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a  s requested. */.
2a330 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47      if( pgno>PAG
2a340 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
2a350 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
2a360 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
2a370 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a380 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2a390 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
2a3a0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
2a3b0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  }..    rc = sqli
2a3c0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
2a3d0 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29  t(pPager, &nMax)
2a3e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2a3f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a400 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
2a410 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  ire_err;.    }..
2a420 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c      if( MEMDB ||
2a430 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20   nMax<(int)pgno 
2a440 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20  || noContent || 
2a450 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2a460 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
2a470 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
2a480 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
2a490 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
2a4a0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
2a4b0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
2a4c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a4d0 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
2a4e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
2a4f0 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62  ure to set the b
2a500 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75  its in the InJou
2a510 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73  rnal bit-vectors
2a520 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20   is benign..    
2a530 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79      ** It merely
2a540 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d   means that we m
2a550 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74  ight do some ext
2a560 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e  ra work to journ
2a570 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  al a .        **
2a580 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
2a590 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
2a5a0 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
2a5b0 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
2a5c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
2a5d0 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68  test the case wh
2a5e0 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72  ere a malloc err
2a5f0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2a600 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20  trying to set . 
2a610 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20         ** a bit 
2a620 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e  in a bit vector.
2a630 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2a640 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
2a650 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
2a660 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
2a670 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
2a680 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2a690 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
2a6a0 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   ) sqlite3Bitvec
2a6b0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
2a6c0 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
2a6d0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2a6e0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
2a6f0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  MEM );.        }
2a700 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  .        TESTONL
2a710 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53  Y( rc = ) addToS
2a720 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
2a730 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
2a740 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2a750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
2a760 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  M );.        sql
2a770 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
2a780 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  loc();.      }. 
2a790 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
2a7a0 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
2a7b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2a7c0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
2a7d0 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
2a7e0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
2a7f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
2a800 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
2a810 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
2a820 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
2a830 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
2a840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a850 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
2a860 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
2a870 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
2a880 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2a890 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
2a8a0 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
2a8b0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
2a8c0 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  Pg);.#endif.  }.
2a8d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2a8e0 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75  _OK;..pager_acqu
2a8f0 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72  ire_err:.  asser
2a900 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2a910 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b   );.  if( pPg ){
2a920 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
2a930 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d  heDrop(pPg);.  }
2a940 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
2a950 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
2a960 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
2a970 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a980 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
2a990 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
2a9a0 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
2a9b0 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
2a9c0 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
2a9d0 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
2a9e0 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
2a9f0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
2aa00 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
2aa10 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
2aa20 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75  ache. Also, retu
2aa30 72 6e 20 30 20 69 66 20 74 68 65 20 0a 2a 2a 20  rn 0 if the .** 
2aa40 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
2aa50 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77  R_UNLOCK state w
2aa60 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2aa70 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  n is called,.** 
2aa80 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
2aa90 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  is in an error s
2aaa0 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
2aab0 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a  SQLITE_FULL..**.
2aac0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2aad0 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
2aae0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
2aaf0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
2ab00 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
2ab10 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
2ab20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
2ab30 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
2ab40 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
2ab50 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
2ab60 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
2ab70 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
2ab80 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
2ab90 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
2aba0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
2abb0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
2abc0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
2abd0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
2abe0 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
2abf0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
2ac00 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
2ac10 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2ac20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
2ac30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ac40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2ac50 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
2ac60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
2ac70 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73  Cache!=0 );.  as
2ac80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2ac90 61 74 65 20 3e 20 50 41 47 45 52 5f 55 4e 4c 4f  ate > PAGER_UNLO
2aca0 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  CK );.  sqlite3P
2acb0 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
2acc0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
2acd0 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65  , 0, &pPg);.  re
2ace0 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
2acf0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
2ad00 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a  e reference..**.
2ad10 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
2ad20 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
2ad30 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
2ad40 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
2ad50 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
2ad60 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
2ad70 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
2ad80 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
2ad90 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
2ada0 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
2adb0 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
2adc0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2add0 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
2ade0 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
2adf0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
2ae00 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
2ae10 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61  f( pPg ){.    Pa
2ae20 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2ae30 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73  g->pPager;.    s
2ae40 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
2ae50 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61  ase(pPg);.    pa
2ae60 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
2ae70 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  d(pPager);.  }.}
2ae80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2ae90 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2aea0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2aeb0 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
2aec0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
2aed0 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
2aee0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
2aef0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2af00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
2af10 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
2af20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2af30 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
2af40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2af50 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
2af60 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
2af70 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
2af80 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
2af90 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
2afa0 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
2afb0 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
2afc0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
2afd0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
2afe0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
2aff0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
2b000 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
2b010 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
2b020 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
2b030 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
2b040 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
2b050 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
2b060 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
2b070 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
2b080 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
2b090 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2b0a0 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
2b0b0 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
2b0c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
2b0d0 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
2b0e0 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
2b0f0 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
2b100 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
2b110 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
2b120 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
2b130 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
2b140 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
2b150 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
2b160 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2b170 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
2b180 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
2b190 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
2b1a0 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
2b1b0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
2b1c0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
2b1d0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
2b1e0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
2b1f0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
2b200 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
2b210 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
2b220 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
2b230 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
2b240 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
2b250 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
2b260 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
2b270 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
2b280 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
2b290 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
2b2a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2b2b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b2c0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2b2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2b2e0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2b2f0 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
2b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b310 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2b320 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
2b330 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
2b340 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2b350 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
2b360 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
2b370 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
2b380 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
2b390 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2b3a0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
2b3b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2b3c0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2b3d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2b3e0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2b3f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2b400 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OFF );.  assert(
2b410 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2b420 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f  nal==0 );.  .  /
2b430 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20  * If already in 
2b440 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
2b450 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2b460 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  s a no-op.  But 
2b470 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65  on.  ** the othe
2b480 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75  r hand, this rou
2b490 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
2b4a0 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61  lled if we are a
2b4b0 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61  lready in.  ** a
2b4c0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a  n error state. *
2b4d0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
2b4e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
2b4f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2b500 65 72 72 43 6f 64 65 3b 0a 0a 20 20 74 65 73 74  errCode;..  test
2b510 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62  case( pPager->db
2b520 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  SizeValid==0 );.
2b530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2b540 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2b550 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
2b560 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2b570 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  rc;.  pPager->pI
2b580 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
2b590 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 6e  e3BitvecCreate(n
2b5a0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 50 61  Page);.  if( pPa
2b5b0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
2b5c0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2b5d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b5e0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
2b5f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b600 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
2b610 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69  ady open. */.  i
2b620 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
2b630 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  r->jfd) ){.    i
2b640 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2b650 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2b660 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2b670 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2b680 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
2b690 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2b6a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
2b6b0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
2b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6d0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2b6e0 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  to open journal 
2b6f0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
2b700 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2b710 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
2b720 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
2b730 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46    (pPager->tempF
2b740 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20  ile ? .         
2b750 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
2b760 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
2b770 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
2b780 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20  RNAL):.         
2b790 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
2b7a0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20  IN_JOURNAL).    
2b7b0 20 20 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51      );.#ifdef SQ
2b7c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2b7d0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72  IC_WRITE.      r
2b7e0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
2b7f0 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
2b800 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
2b810 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
2b820 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72  ->jfd, flags, jr
2b830 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
2b840 67 65 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65  ger).      );.#e
2b850 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73  lse.      rc = s
2b860 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2b870 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2b880 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
2b890 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e  , flags, 0);.#en
2b8a0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  dif.    }.    as
2b8b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2b8c0 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
2b8d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
2b8e0 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  }...  /* Write t
2b8f0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
2b900 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
2b910 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
2b920 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73  open .  ** the s
2b930 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
2b940 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
2b950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b960 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K ){.    /* TODO
2b970 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f  : Check if all o
2b980 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c  f these are real
2b990 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ly required. */.
2b9a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
2b9b0 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
2b9c0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  >dbSize;.    pPa
2b9d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
2b9e0 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ted = 0;.    pPa
2b9f0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
2ba00 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
2ba10 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
2ba20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
2ba30 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
2ba40 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
2ba50 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2ba60 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
2ba70 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
2ba80 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
2ba90 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
2baa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2bab0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
2bac0 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
2bad0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
2bae0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
2baf0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
2bb00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
2bb10 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
2bb20 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
2bb30 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
2bb40 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
2bb50 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
2bb60 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
2bb70 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
2bb80 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2bb90 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
2bba0 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
2bbb0 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  t is false, then
2bbc0 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
2bbd0 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  t a RESERVED.** 
2bbe0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2bbf0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78  base file. If ex
2bc00 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
2bc10 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
2bc20 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53  ast.** an EXCLUS
2bc30 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63  IVE lock. If suc
2bc40 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  h a lock is alre
2bc50 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63  ady held, no loc
2bc60 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  king .** functio
2bc70 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65  ns need be calle
2bc80 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  d..**.** If this
2bc90 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
2bca0 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ary or in-memory
2bcb0 20 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a   file and, the j
2bcc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
2bcd0 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20  ** opened if it 
2bce0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72  has not been alr
2bcf0 65 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70  eady. For a temp
2bd00 6f 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20  orary file, the 
2bd10 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74  opening .** of t
2bd20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2bd30 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
2bd40 6c 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 63  l there is an ac
2bd50 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a  tual need to .**
2bd60 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
2bd70 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79  urnal. TODO: Why
2bd80 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72   handle temporar
2bd90 79 20 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e  y files differen
2bda0 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  tly?.**.** If th
2bdb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2bdc0 73 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20  s opened (or if 
2bdd0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
2bde0 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a  en), then a.** j
2bdf0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
2be00 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2be10 73 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a  start of it..**.
2be20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
2be30 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
2be40 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2be50 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
2be60 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
2be70 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
2be80 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
2be90 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
2bea0 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
2beb0 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
2bec0 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
2bed0 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
2bee0 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
2bef0 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
2bf00 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
2bf10 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
2bf20 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
2bf30 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
2bf40 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
2bf50 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
2bf60 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
2bf70 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
2bf80 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
2bf90 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
2bfa0 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
2bfb0 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
2bfc0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2bfd0 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
2bfe0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2bff0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
2c000 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
2c010 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
2c020 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
2c030 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
2c040 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2c050 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
2c060 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
2c070 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
2c080 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
2c090 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
2c0a0 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
2c0b0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
2c0c0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
2c0d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2c0e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2c0f0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2c100 74 28 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50  t( !MEMDB && !pP
2c110 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2c120 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
2c130 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2c140 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
2c150 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
2c160 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
2c170 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
2c180 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
2c190 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
2c1a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2c1b0 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
2c1c0 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
2c1d0 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
2c1e0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
2c1f0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2c200 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78   && sqlite3WalEx
2c210 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
2c220 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
2c230 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2c240 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
2c250 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
2c260 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
2c270 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2c280 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
2c290 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2c2a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c2b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2c2c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c2d0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63     sqlite3WalExc
2c2e0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
2c2f0 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20  r->pWal, 1);.   
2c300 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
2c310 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f  rab the write lo
2c320 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69  ck on the log fi
2c330 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
2c340 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20  l, upgrade to.  
2c350 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53      ** PAGER_RES
2c360 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68  ERVED state. Oth
2c370 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
2c380 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
2c390 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
2c3a0 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61    ** The busy-ha
2c3b0 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76  ndler is not inv
2c3c0 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20  oked if another 
2c3d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61  connection alrea
2c3e0 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64  dy.      ** hold
2c3f0 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  s the write-lock
2c400 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  . If possible, t
2c410 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
2c420 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20  ill call it..   
2c430 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
2c440 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67  AL mode sets Pag
2c450 65 72 2e 73 74 61 74 65 20 74 6f 20 50 41 47 45  er.state to PAGE
2c460 52 5f 52 45 53 45 52 56 45 44 20 77 68 65 6e 20  R_RESERVED when 
2c470 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 0a 20  it has an open. 
2c480 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
2c490 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74  ion, but never t
2c4a0 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
2c4b0 45 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  E. This is becau
2c4c0 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  se in .      ** 
2c4d0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2c4e0 73 74 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  state the code t
2c4f0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
2c500 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
2c510 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ns.      ** may 
2c520 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
2c530 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
2c540 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
2c550 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 0a 20 20   file as well.  
2c560 20 20 20 20 2a 2a 20 61 73 20 69 6e 74 6f 20 74      ** as into t
2c570 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57  he page cache. W
2c580 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e  hich would be in
2c590 63 6f 72 72 65 63 74 20 69 6e 20 57 41 4c 20 6d  correct in WAL m
2c5a0 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
2c5b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c5c0 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
2c5d0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
2c5e0 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  >pWal);.      if
2c5f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c600 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2c610 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
2c620 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
2c630 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2c640 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
2c650 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
2c660 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2c670 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ff = 0;.      }.
2c680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
2c690 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2c6a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
2c6b0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
2c6c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
2c6d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
2c6e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
2c6f0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
2c700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c710 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
2c720 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
2c730 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2c740 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
2c750 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a  rameter.      **
2c760 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69   is true, then i
2c770 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61  mmediately upgra
2c780 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58  de this to an EX
2c790 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
2c7a0 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d  e.      ** busy-
2c7b0 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
2c7c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
2c7d0 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74  n upgrading to t
2c7e0 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  he EXCLUSIVE.   
2c7f0 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20     ** lock, but 
2c800 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69  not when obtaini
2c810 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ng the RESERVED 
2c820 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lock..      */. 
2c830 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c840 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
2c850 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
2c860 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
2c870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c880 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
2c890 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
2c8a0 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69  ERVED;.        i
2c8b0 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
2c8c0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2c8d0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
2c8e0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
2c8f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2c900 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2c910 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20  .    /* No need 
2c920 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2c930 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 69 73  nal file at this
2c940 20 74 69 6d 65 2e 20 20 49 74 20 77 69 6c 6c 20   time.  It will 
2c950 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64  be.    ** opened
2c960 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72   before it is wr
2c970 69 74 74 65 6e 20 74 6f 2e 20 20 49 66 20 77 65  itten to.  If we
2c980 20 64 65 66 65 72 20 6f 70 65 6e 69 6e 67 20 74   defer opening t
2c990 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20 20 20 20  he journal,.    
2c9a0 2a 2a 20 77 65 20 6d 69 67 68 74 20 73 61 76 65  ** we might save
2c9b0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 63 72 65   the work of cre
2c9c0 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69 66 20  ating a file if 
2c9d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
2c9e0 20 20 20 20 2a 2a 20 65 6e 64 73 20 75 70 20 62      ** ends up b
2c9f0 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  eing a no-op..  
2ca00 20 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 72 63    */..    if( rc
2ca10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ca20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
2ca30 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2ca40 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 49 67 6e   );.      /* Ign
2ca50 6f 72 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72  ore any IO error
2ca60 20 74 68 61 74 20 6f 63 63 75 72 73 20 77 69 74   that occurs wit
2ca70 68 69 6e 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  hin pager_end_tr
2ca80 61 6e 73 61 63 74 69 6f 6e 28 29 2e 20 54 68 65  ansaction(). The
2ca90 0a 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73  .      ** purpos
2caa0 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e of this call i
2cab0 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 69  s to reset the i
2cac0 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
2cad0 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 20   the pager.     
2cae0 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e 20   ** sub-system. 
2caf0 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  It doesn't matte
2cb00 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r if the journal
2cb10 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 72 6f  -file is not pro
2cb20 70 65 72 6c 79 0a 20 20 20 20 20 20 2a 2a 20 66  perly.      ** f
2cb30 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73  inalized at this
2cb40 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74   point (since it
2cb50 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
2cb60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79  journal file any
2cb70 77 61 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  way)..      */. 
2cb80 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74       pager_end_t
2cb90 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2cba0 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  r, 0);.    }.  }
2cbb0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2cbc0 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
2cbd0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2cbe0 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  er)));.  return 
2cbf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
2cc00 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
2cc10 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
2cc20 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
2cc30 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
2cc40 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
2cc50 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
2cc60 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
2cc70 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
2cc80 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
2cc90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
2cca0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2ccb0 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
2ccc0 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
2ccd0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
2cce0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
2ccf0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
2cd00 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
2cd10 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
2cd20 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
2cd30 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
2cd40 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
2cd50 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2cd60 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
2cd70 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
2cd80 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2cd90 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
2cda0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2cdb0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2cdc0 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  e is not called 
2cdd0 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
2cde0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2cdf0 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72 74   been.  ** start
2ce00 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
2ce10 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2ce20 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
2ce30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   );..  /* If an 
2ce40 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
2ce50 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74  reviously detect
2ce60 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73  ed, report the s
2ce70 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61  ame error.  ** a
2ce80 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
2ce90 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2cea0 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75 72  rrCode) )  retur
2ceb0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
2cec0 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d  e;..  /* Higher-
2ced0 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e  level routines n
2cee0 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66  ever call this f
2cef0 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62  unction if datab
2cf00 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ase is not.  ** 
2cf10 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63  writable.  But c
2cf20 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73  heck anyway, jus
2cf30 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  t for robustness
2cf40 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
2cf50 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c  (pPager->readOnl
2cf60 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  y) ) return SQLI
2cf70 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61 73 73 65  TE_PERM;..  asse
2cf80 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
2cf90 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
2cfa0 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
2cfb0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
2cfc0 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
2cfd0 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
2cfe0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
2cff0 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
2d000 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
2d010 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
2d020 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  way..  */.  sqli
2d030 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
2d040 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  ty(pPg);.  if( p
2d050 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
2d060 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72  ) && !subjRequir
2d070 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
2d080 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
2d090 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2d0a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2d0b0 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
2d0c0 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
2d0d0 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
2d0e0 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
2d0f0 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
2d100 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
2d110 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
2d120 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
2d130 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
2d140 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
2d150 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
2d160 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68 65 72 20  *.    ** Higher 
2d170 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 73  level routines s
2d180 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
2d190 64 79 20 73 74 61 72 74 65 64 20 61 20 74 72 61  dy started a tra
2d1a0 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a  nsaction,.    **
2d1b0 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65   which means the
2d1c0 79 20 68 61 76 65 20 61 63 71 75 69 72 65 64 20  y have acquired 
2d1d0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  the necessary lo
2d1e0 63 6b 73 20 62 75 74 20 74 68 65 20 72 6f 6c 6c  cks but the roll
2d1f0 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  back.    ** jour
2d200 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65  nal might not ye
2d210 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a  t be open..    *
2d220 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2d230 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 52 45 53  ager->state>=RES
2d240 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
2d250 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
2d260 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 0a 20 20 20 20  nJournal==0.    
2d270 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2d280 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
2d290 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
2d2a0 20 20 20 20 20 26 26 20 21 70 61 67 65 72 55 73       && !pagerUs
2d2b0 65 57 61 6c 28 70 50 61 67 65 72 29 0a 20 20 20  eWal(pPager).   
2d2c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2d2d0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2d2e0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 72 63  rnal );.      rc
2d2f0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
2d300 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
2d310 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2d320 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2d330 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
2d340 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2d350 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 1;.  .    /* 
2d360 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
2d370 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
2d380 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
2d390 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
2d3a0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
2d3b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
2d3c0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
2d3d0 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
2d3e0 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
2d3f0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
2d400 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
2d410 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
2d420 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
2d430 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75    if( !pageInJou
2d440 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69 73 4f  rnal(pPg) && isO
2d450 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2d460 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2d470 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
2d480 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
2d490 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  if( pPg->pgno<=p
2d4a0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2d4b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  e ){.        u32
2d4c0 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
2d4d0 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
2d4e0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
2d4f0 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
2d500 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2d510 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
2d520 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
2d530 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
2d540 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
2d550 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
2d560 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
2d570 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
2d580 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ot. */.        a
2d590 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
2d5a0 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
2d5b0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
2d5c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2d5d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
2d5e0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
2d5f0 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20  lOff );.        
2d600 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
2d610 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
2d620 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
2d630 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
2d640 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
2d650 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
2d660 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
2d670 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  2);.        rc =
2d680 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
2d690 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
2d6a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
2d6b0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
2d6c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d6d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2d6e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2d6f0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
2d700 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
2d710 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
2d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d730 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2d740 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34  ->journalOff + 4
2d750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
2d760 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
2d770 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
2d780 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d  ize+4;.        }
2d790 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2d7a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d7b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
2d7c0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
2d7d0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
2d7e0 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29  urnalOff, cksum)
2d7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2d800 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
2d810 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
2d820 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
2d830 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
2d840 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
2d850 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
2d860 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
2d870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
2d880 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2d890 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
2d8a0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
2d8b0 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
2d8c0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
2d8d0 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
2d8e0 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
2d8f0 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
2d900 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
2d910 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
2d920 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
2d930 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
2d940 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2d950 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
2d960 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
2d970 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20  h(pPg)));..     
2d980 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e     /* Even if an
2d990 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20   IO or diskfull 
2d9a0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77  error occurred w
2d9b0 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
2d9c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2d9d0 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
2d9e0 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
2d9f0 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
2da00 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
2da10 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
2da20 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61  se, when the tra
2da30 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
2da40 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67  ed back, the log
2da50 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ic in.        **
2da60 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
2da70 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
2da80 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
2da90 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
2daa0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ed.        ** in
2dab0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2dac0 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
2dad0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2dae0 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
2daf0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f        ** then co
2db00 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c  rruption may fol
2db10 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  low..        */.
2db20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2db30 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2db40 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
2db50 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
2db60 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
2db70 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
2db80 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
2db90 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
2dba0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
2dbb0 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
2dbc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2dbd0 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   The .        **
2dbe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
2dbf0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
2dc00 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
2dc10 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
2dc20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2dc30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dc40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2dc50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2dc60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
2dc70 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
2dc80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
2dc90 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
2dca0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2dcb0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
2dcc0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
2dcd0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2dce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
2dcf0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
2dd00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2dd10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2dd20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
2dd30 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MEM );.        r
2dd40 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
2dd50 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
2dd60 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
2dd70 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2dd80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dd90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2dda0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
2ddb0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2ddc0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2ddd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2dde0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2ddf0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
2de00 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
2de10 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
2de20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
2de30 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
2de40 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2de50 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
2de60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2de70 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2de80 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
2de90 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
2dea0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2deb0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
2dec0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
2dee0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2def0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
2df00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2df10 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
2df20 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
2df30 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
2df40 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2df50 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
2df60 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
2df70 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
2df80 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
2df90 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
2dfa0 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
2dfb0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
2dfc0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
2dfd0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
2dfe0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
2dff0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
2e000 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
2e010 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
2e020 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2e030 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2e040 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
2e050 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
2e060 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
2e070 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
2e080 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
2e090 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
2e0a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2e0b0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2e0c0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
2e0d0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
2e0e0 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
2e0f0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2e100 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
2e110 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2e120 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
2e130 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
2e140 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
2e150 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
2e160 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
2e170 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
2e180 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
2e190 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
2e1a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2e1b0 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
2e1c0 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
2e1d0 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
2e1e0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
2e1f0 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
2e200 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2e210 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
2e220 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2e230 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
2e240 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
2e250 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
2e260 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
2e270 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
2e280 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
2e290 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
2e2a0 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
2e2b0 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
2e2c0 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
2e2d0 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
2e2e0 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
2e2f0 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
2e300 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
2e310 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
2e320 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
2e330 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2e340 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
2e350 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
2e360 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2e370 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
2e380 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
2e390 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
2e3a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
2e3b0 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
2e3c0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
2e3d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
2e3e0 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
2e3f0 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
2e400 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2e410 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
2e420 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
2e430 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
2e440 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2e450 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
2e460 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
2e470 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
2e480 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
2e490 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
2e4a0 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
2e4b0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
2e4c0 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
2e4d0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2e4e0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
2e4f0 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
2e500 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
2e510 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20   nPage = 0;     
2e520 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e530 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
2e540 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
2e550 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
2e560 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
2e570 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2e580 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
2e590 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
2e5a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2e5b0 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
2e5c0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
2e5d0 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  /..    /* Set th
2e5e0 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  e doNotSyncSpill
2e5f0 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
2e600 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
2e610 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20  annot allow.    
2e620 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ** a journal hea
2e630 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
2e640 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
2e650 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
2e660 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
2e670 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
2e680 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
2e690 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e6a0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
2e6b0 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  cSpill==0 );.   
2e6c0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
2e6d0 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20  ncSpill++;..    
2e6e0 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
2e6f0 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
2e700 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
2e710 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
2e720 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
2e730 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
2e740 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
2e750 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
2e760 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
2e770 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
2e780 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
2e790 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
2e7a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
2e7b0 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
2e7c0 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
2e7d0 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
2e7e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2e7f0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2e800 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61  ger, (int *)&nPa
2e810 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66  geCount);.    if
2e820 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e830 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  ){.      if( pPg
2e840 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e  ->pgno>nPageCoun
2e850 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 61  t ){.        nPa
2e860 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
2e870 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 20 20  - pg1)+1;.      
2e880 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
2e890 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
2e8a0 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
2e8b0 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e         nPage = n
2e8c0 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
2e8d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2e8e0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
2e8f0 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
2e900 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2e910 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
2e920 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70     assert(pg1<=p
2e930 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
2e940 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
2e950 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
2e960 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
2e970 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
2e980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
2e990 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
2e9a0 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
2e9b0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
2e9c0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d  e;.      if( pg=
2e9d0 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73  =pPg->pgno || !s
2e9e0 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
2e9f0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
2ea00 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20  nal, pg) ){.    
2ea10 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
2ea20 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
2ea30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
2ea40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ea50 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20  Get(pPager, pg, 
2ea60 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
2ea70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ea80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ea90 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2eaa0 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
2eab0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
2eac0 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
2ead0 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
2eae0 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
2eaf0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
2eb00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50         assert(pP
2eb10 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
2eb20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2eb30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2eb40 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
2eb50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ge);.          }
2eb60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2eb70 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67   }else if( (pPag
2eb80 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
2eb90 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30  (pPager, pg))!=0
2eba0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2ebb0 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
2ebc0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
2ebd0 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
2ebe0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
2ebf0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2ec00 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
2ec10 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
2ec20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
2ec30 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2ec40 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
2ec50 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67   any of the nPag
2ec60 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
2ec70 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c  starting at pg1,
2ec80 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74   then it needs t
2ec90 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c  o be set for all
2eca0 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73   of them. Becaus
2ecb0 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67  e.    ** writing
2ecc0 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65   to any of these
2ecd0 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79   nPage pages may
2ece0 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65   damage the othe
2ecf0 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a  rs, the.    ** j
2ed00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
2ed10 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65   contain sync()e
2ed20 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20  d copies of all 
2ed30 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62  of them.    ** b
2ed40 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65  efore any of the
2ed50 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  m can be written
2ed60 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2ed70 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
2ed80 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2ed90 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53  LITE_OK && needS
2eda0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ync ){.      ass
2edb0 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70  ert( !MEMDB && p
2edc0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30  Pager->noSync==0
2edd0 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69   );.      for(ii
2ede0 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69  =0; ii<nPage; ii
2edf0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  ++){.        PgH
2ee00 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65  dr *pPage = page
2ee10 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
2ee20 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20   pg1+ii);.      
2ee30 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
2ee40 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
2ee50 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
2ee60 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
2ee70 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2ee80 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
2ee90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2eea0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
2eeb0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
2eec0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
2eed0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
2eee0 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a  SyncSpill==1 );.
2eef0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
2ef00 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20  tSyncSpill--;.  
2ef10 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2ef20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
2ef30 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
2ef40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2ef50 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ef60 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
2ef70 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
2ef80 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
2ef90 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
2efa0 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
2efb0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2efc0 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
2efd0 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
2efe0 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
2eff0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
2f000 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2f010 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2f020 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
2f030 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
2f040 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  rn pPg->flags&PG
2f050 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e  HDR_DIRTY;.}.#en
2f060 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
2f070 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
2f080 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
2f090 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
2f0a0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
2f0b0 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
2f0c0 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70  mation on page p
2f0d0 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  Pg back to the d
2f0e0 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
2f0f0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
2f100 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
2f110 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61   dirty.  This ha
2f120 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
2f130 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  le, when.** the 
2f140 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64  page has been ad
2f150 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66  ded as a leaf of
2f160 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2f170 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74  d so its.** cont
2f180 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61  ent no longer ma
2f190 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tters..**.** The
2f1a0 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
2f1b0 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
2f1c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
2f1d0 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
2f1e0 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
2f1f0 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
2f200 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b  . The pager mark
2f210 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
2f220 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
2f230 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
2f240 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
2f250 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
2f260 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
2f270 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64  ization can quad
2f280 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
2f290 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c  of large .** DEL
2f2a0 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ETE operations..
2f2b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
2f2c0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67  agerDontWrite(Pg
2f2d0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
2f2e0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
2f2f0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
2f300 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2f310 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67  R_DIRTY) && pPag
2f320 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
2f330 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  0 ){.    PAGERTR
2f340 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE(("DONT_WRITE
2f350 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
2f360 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
2f370 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
2f380 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43  .    IOTRACE(("C
2f390 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
2f3a0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2f3b0 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  )).    pPg->flag
2f3c0 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f  s |= PGHDR_DONT_
2f3d0 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51  WRITE;.#ifdef SQ
2f3e0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
2f3f0 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
2f400 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
2f410 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
2f420 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2f430 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2f440 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
2f450 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
2f460 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f470 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e   .** change-coun
2f480 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ter, stored as a
2f490 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
2f4a0 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74  an integer start
2f4b0 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20  ing at .** byte 
2f4c0 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
2f4d0 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a   pager file..**.
2f4e0 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72 65  ** If the isDire
2f4f0 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a  ctMode flag is z
2f500 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ero, then this i
2f510 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e  s done by callin
2f520 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  g .** sqlite3Pag
2f530 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67  erWrite() on pag
2f540 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79  e 1, then modify
2f550 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
2f560 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
2f570 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61  data. In this ca
2f580 73 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  se the file will
2f590 20 62 65 20 75 70 64 61 74 65 64 20 77 68 65 6e   be updated when
2f5a0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2f5b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2f5c0 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
2f5d0 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  The isDirectMode
2f5e0 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62   flag may only b
2f5f0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  e non-zero if th
2f600 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f  e library was co
2f610 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74  mpiled.** with t
2f620 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
2f630 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61  _ATOMIC_WRITE ma
2f640 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20  cro defined. In 
2f650 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66  this case,.** if
2f660 20 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e   isDirect is non
2f670 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
2f680 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2f690 20 75 70 64 61 74 65 64 20 64 69 72 65 63 74 6c   updated directl
2f6a0 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20  y.** by writing 
2f6b0 61 6e 20 75 70 64 61 74 65 64 20 76 65 72 73 69  an updated versi
2f6c0 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73 69  on of page 1 usi
2f6d0 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65  ng a call to the
2f6e0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72   .** sqlite3OsWr
2f6f0 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ite() function..
2f700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2f710 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2f720 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50  ounter(Pager *pP
2f730 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65  ager, int isDire
2f740 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72  ctMode){.  int r
2f750 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2f760 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64    /* Declare and
2f770 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73   initialize cons
2f780 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73  tant integer 'is
2f790 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a  Direct'. If the.
2f7a0 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74    ** atomic-writ
2f7b0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2f7c0 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69  s enabled in thi
2f7d0 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73  s build, then is
2f7e0 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69  Direct.  ** is i
2f7f0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
2f800 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
2f810 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  s the isDirectMo
2f820 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  de parameter.  *
2f830 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
2f840 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  on. Otherwise, i
2f850 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  t is always set 
2f860 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  to zero..  **.  
2f870 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
2f880 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69  hat if the atomi
2f890 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2f8a0 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  tion is not.  **
2f8b0 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
2f8c0 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f  ile time, the co
2f8d0 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20  mpiler can omit 
2f8e0 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a  the tests of.  *
2f8f0 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c  * 'isDirect' bel
2f900 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74  ow, as well as t
2f910 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65  he block enclose
2f920 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69  d in the.  ** "i
2f930 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63  f( isDirect )" c
2f940 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  ondition..  */.#
2f950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
2f960 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2f970 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  E.# define DIREC
2f980 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72  T_MODE 0.  asser
2f990 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d  t( isDirectMode=
2f9a0 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =0 );.  UNUSED_P
2f9b0 41 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63  ARAMETER(isDirec
2f9c0 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20  tMode);.#else.# 
2f9d0 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
2f9e0 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a  DE isDirectMode.
2f9f0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
2fa00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2fa10 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
2fa20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
2fa30 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2fa40 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  e && pPager->dbS
2fa50 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  ize>0 ){.    PgH
2fa60 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20  dr *pPgHdr;     
2fa70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2fa80 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
2fa90 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61  1 */.    u32 cha
2faa0 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20  nge_counter;    
2fab0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2fac0 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67  l value of chang
2fad0 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2fae0 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
2faf0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2fb00 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  e && isOpen(pPag
2fb10 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20  er->fd) );..    
2fb20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
2fb30 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
2fb40 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
2fb50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2fb60 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
2fb70 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73  pPgHdr);.    ass
2fb80 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c  ert( pPgHdr==0 |
2fb90 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
2fba0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61  );..    /* If pa
2fbb0 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68  ge one was fetch
2fbc0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
2fbd0 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
2fbe0 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a  on is not.    **
2fbf0 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69   operating in di
2fc00 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20  rect-mode, make 
2fc10 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e  page 1 writable.
2fc20 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20    When not in . 
2fc30 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64     ** direct mod
2fc40 65 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c 77  e, page 1 is alw
2fc50 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68  ays held in cach
2fc60 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  e and hence the 
2fc70 50 61 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a  PagerGet().    *
2fc80 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79  * above is alway
2fc90 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68  s successful - h
2fca0 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53 20  ence the ALWAYS 
2fcb0 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  on rc==SQLITE_OK
2fcc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2fcd0 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26   !DIRECT_MODE &&
2fce0 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49   ALWAYS(rc==SQLI
2fcf0 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
2fd00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fd10 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a  rWrite(pPgHdr);.
2fd20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
2fd30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fd40 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
2fd50 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
2fd60 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
2fd70 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
2fd80 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68   24. */.      ch
2fd90 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
2fda0 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
2fdb0 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
2fdc0 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63  leVers);.      c
2fdd0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
2fde0 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73  .      put32bits
2fdf0 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d  (((char*)pPgHdr-
2fe00 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
2fe10 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
2fe20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72      /* Also stor
2fe30 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72  e the SQLite ver
2fe40 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62  sion number in b
2fe50 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20  ytes 96..99 and 
2fe60 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  in.      ** byte
2fe70 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74  s 92..95 store t
2fe80 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
2fe90 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
2fea0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20  version number. 
2feb0 20 20 20 20 20 2a 2a 20 69 73 20 76 61 6c 69 64       ** is valid
2fec0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 75 74 33 32  . */.      put32
2fed0 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
2fee0 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20  Hdr->pData)+92, 
2fef0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
2ff00 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73  .      put32bits
2ff10 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d  (((char*)pPgHdr-
2ff20 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
2ff30 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
2ff40 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  R);..      /* If
2ff50 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65   running in dire
2ff60 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74  ct mode, write t
2ff70 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
2ff80 61 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c  age 1 to the fil
2ff90 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
2ffa0 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20  DIRECT_MODE ){. 
2ffb0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
2ffc0 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20 20 20 20  d *zBuf;.       
2ffd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ffe0 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b  >dbFileSize>0 );
2fff0 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28  .        CODEC2(
30000 70 50 61 67 65 72 2c 20 70 50 67 48 64 72 2d 3e  pPager, pPgHdr->
30010 70 44 61 74 61 2c 20 31 2c 20 36 2c 20 72 63 3d  pData, 1, 6, rc=
30020 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42  SQLITE_NOMEM, zB
30030 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  uf);.        if(
30040 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30050 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
30060 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
30070 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
30080 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
30090 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ze, 0);.        
300a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
300b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
300c0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
300d0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
300e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
300f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30100 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
30110 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
30120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30130 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
30140 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
30150 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
30160 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
30170 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
30180 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
30190 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20 66  Sync the pager f
301a0 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69  ile to disk. Thi
301b0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  s is a no-op for
301c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
301d0 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74  .** or pages wit
301e0 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  h the Pager.noSy
301f0 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  nc flag set..**.
30200 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
30210 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61  , or called on a
30220 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68   pager for which
30230 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20   it is a no-op, 
30240 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
30250 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
30260 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  OK. Otherwise, a
30270 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
30280 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
30290 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
302a0 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  Sync(Pager *pPag
302b0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
302c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
302e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
302f0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
30300 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
30310 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
30320 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30330 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
30340 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
30350 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
30360 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
30370 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
30380 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
30390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
303a0 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
303b0 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
303c0 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
303d0 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
303e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
303f0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
30400 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
30410 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
30420 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
30430 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
30440 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
30450 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
30460 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
30470 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
30480 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
30490 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
304a0 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a  nsures that:.**.
304b0 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
304c0 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
304d0 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61 74  counter is updat
304e0 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a  ed,.**   * the j
304f0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
30500 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f   (unless the ato
30510 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
30520 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c  zation is used),
30530 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74  .**   * all dirt
30540 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  y pages are writ
30550 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
30560 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20  ase file, .**   
30570 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
30580 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
30590 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20   (if required), 
305a0 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  and.**   * the d
305b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
305c0 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ced. .**.** The 
305d0 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20  only thing that 
305e0 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
305f0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
30600 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  n is to finalize
30610 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72   .** (delete, tr
30620 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
30630 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f 66  he first part of
30640 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ) the journal fi
30650 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74  le (or .** delet
30660 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
30670 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
30680 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
30690 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
306a0 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
306b0 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
306c0 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
306d0 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
306e0 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72   an sqlite3Pager
306f0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
30700 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
30710 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  the final parame
30720 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69  ter - noSync - i
30730 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
30740 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
30750 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20  tself.** is not 
30760 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c  synced. The call
30770 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c  er must call sql
30780 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20  ite3PagerSync() 
30790 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73  directly to.** s
307a0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
307b0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
307c0 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65  ling CommitPhase
307d0 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20  Two() to delete 
307e0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
307f0 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
30800 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30810 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
30820 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  One(.  Pager *pP
30830 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
30840 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
30850 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
30860 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
30870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
30880 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
30890 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
308a0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53  ame */.  int noS
308b0 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
308c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
308d0 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79   to omit the xSy
308e0 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  nc on the db fil
308f0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
30900 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
30920 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
30930 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65  * The dbOrigSize
30940 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 69 66   is never set if
30950 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46   journal_mode=OF
30960 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  F */.  assert( p
30970 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
30980 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
30990 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 50 61  LMODE_OFF || pPa
309a0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
309b0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  =0 );..  /* If a
309c0 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63 63   prior error occ
309d0 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74 68  urred, report th
309e0 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e 20  at error again. 
309f0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
30a00 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
30a10 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
30a20 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  e;..  PAGERTRACE
30a30 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  (("DATABASE SYNC
30a40 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
30a50 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22  r=%s nSize=%d\n"
30a60 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
30a70 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
30a80 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ter, pPager->dbS
30a90 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28 20 4d 45  ize));..  if( ME
30aa0 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
30ab0 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20  bModified ){.   
30ac0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
30ad0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
30ae0 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
30af0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
30b00 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a  , or this.    **
30b10 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c   function has al
30b20 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
30b30 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20  d, it is mostly 
30b40 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65  a no-op.  Howeve
30b50 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61  r, any.    ** ba
30b60 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73  ckup in progress
30b70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
30b80 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  tarted..    */. 
30b90 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
30ba0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
30bb0 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73  pBackup);.  }els
30bc0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
30bd0 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
30be0 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  D && pPager->dbM
30bf0 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20 20 69  odified ){.    i
30c00 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
30c10 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
30c20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73  PgHdr *pList = s
30c30 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
30c40 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
30c50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 69 66  Cache);.      if
30c60 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
30c70 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
30c80 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
30c90 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e 64 62  List, pPager->db
30ca0 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20 20 20 20  Size, 1, .      
30cb0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 66        (pPager->f
30cc0 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61 67 65 72  ullSync ? pPager
30cd0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3a 20 30  ->sync_flags : 0
30ce0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
30cf0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
30d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30d10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
30d20 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
30d30 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
30d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
30d50 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e{.      /* The 
30d60 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
30d70 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
30d80 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63  ge-counter. Exac
30d90 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20 20  tly how it.     
30da0 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65   ** does this de
30db0 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
30dc0 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
30dd0 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69  ic-update optimi
30de0 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  zation.      ** 
30df0 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
30e00 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64  ompile time, and
30e10 20 69 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   if this transac
30e20 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a  tion meets the .
30e30 20 20 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65        ** runtime
30e40 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65   criteria to use
30e50 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20   the operation: 
30e60 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
30e70 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65  **    * The file
30e80 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
30e90 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
30ea0 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20  e property for. 
30eb0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f       **      blo
30ec0 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
30ed0 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20  -size, and .    
30ee0 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63    **    * This c
30ef0 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
30f00 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
30f10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
30f20 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  nd.      **    *
30f30 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
30f40 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
30f50 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
30f60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30f70 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
30f80 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69    ** If the opti
30f90 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74  mization was not
30fa0 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
30fb0 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74  ile time, then t
30fc0 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  he.      ** page
30fd0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
30fe0 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  nter() function 
30ff0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64  is called to upd
31000 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20  ate the change. 
31010 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20       ** counter 
31020 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64  in 'indirect-mod
31030 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d  e'. If the optim
31040 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69  ization is compi
31050 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 20  led in but.     
31060 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69   ** is not appli
31070 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72  cable to this tr
31080 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20  ansaction, call 
31090 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
310a0 65 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  eate().      ** 
310b0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
310c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
310d0 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20  s actually been 
310e0 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61  created, then ca
310f0 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  ll.      ** page
31100 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
31110 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
31120 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
31130 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a  ter in indirect.
31140 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a        ** mode. .
31150 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
31160 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
31170 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
31180 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64   is both enabled
31190 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c   and applicable,
311a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63  .      ** then c
311b0 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  all pager_incr_c
311c0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
311d0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
311e0 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20  nge-counter.    
311f0 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27    ** in 'direct'
31200 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63   mode. In this c
31210 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
31220 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  file will never 
31230 62 65 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61  be.      ** crea
31240 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61  ted for this tra
31250 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
31260 2a 2f 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  */.  #ifdef SQLI
31270 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
31280 5f 57 52 49 54 45 0a 20 20 20 20 20 20 50 67 48  _WRITE.      PgH
31290 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 61  dr *pPg;.      a
312a0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
312b0 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
312c0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
312d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
312e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
312f0 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
31300 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
31310 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
31320 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
31330 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
31340 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69  f( !zMaster && i
31350 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
31360 64 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  d) .       && pP
31370 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
31380 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
31390 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
313a0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
313b0 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze>=pPager->dbFi
313c0 6c 65 53 69 7a 65 0a 20 20 20 20 20 20 20 26 26  leSize.       &&
313d0 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69   (0==(pPg = sqli
313e0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
313f0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
31400 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e  he)) || 0==pPg->
31410 70 44 69 72 74 79 29 0a 20 20 20 20 20 20 29 7b  pDirty).      ){
31420 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61  .        /* Upda
31430 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63  te the db file c
31440 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69  hange counter vi
31450 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69  a the direct-wri
31460 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a  te method. The .
31470 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f          ** follo
31480 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d  wing call will m
31490 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d  odify the in-mem
314a0 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
314b0 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20  on of page 1 .  
314c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c        ** to incl
314d0 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64 20  ude the updated 
314e0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
314f0 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
31500 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a  ge 1 .        **
31510 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
31520 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
31530 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61  Because of the a
31540 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20  tomic-write .   
31550 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79       ** property
31560 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c   of the host fil
31570 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69  e-system, this i
31580 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 20 20  s safe..        
31590 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
315a0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
315b0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
315c0 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
315d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
315e0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
315f0 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
31600 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31620 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
31630 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
31640 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
31650 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
31660 20 20 20 7d 0a 20 20 23 65 6c 73 65 0a 20 20 20     }.  #else.   
31670 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
31680 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
31690 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 23  (pPager, 0);.  #
316a0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
316b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
316c0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
316d0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20  e_one_exit;.  . 
316e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
316f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
31700 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
31710 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
31720 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
31730 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
31740 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
31750 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
31760 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
31770 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  nal.      ** fil
31780 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
31790 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
317a0 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20  vacuum mode..   
317b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
317c0 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68  efore reading th
317d0 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  e pages with pag
317e0 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72  e numbers larger
317f0 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 20   than the .     
31800 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75   ** current valu
31810 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
31820 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62 61  e, set dbSize ba
31830 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ck to the value.
31840 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74        ** that it
31850 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61   took at the sta
31860 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
31870 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
31880 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  , the.      ** c
31890 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
318a0 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72 6e  agerGet() return
318b0 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e   zeroed pages in
318c0 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 20 20  stead of .      
318d0 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61 20  ** reading data 
318e0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
318f0 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  e file..      **
31900 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 6a  .      ** When j
31910 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d 4f 46 46  ournal_mode==OFF
31920 20 74 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   the dbOrigSize 
31930 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2c 20  is always zero, 
31940 73 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  so this.      **
31950 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20 72 75 6e   block never run
31960 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  s if journal_mod
31970 65 3d 4f 46 46 2e 0a 20 20 20 20 20 20 2a 2f 0a  e=OFF..      */.
31980 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45    #ifndef SQLITE
31990 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
319a0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
319b0 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72  r->dbSize<pPager
319c0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
319d0 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70       && ALWAYS(p
319e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
319f0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
31a00 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20 20  LMODE_OFF).     
31a10 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
31a20 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
31a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a40 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
31a50 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
31a60 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f        const Pgno
31a70 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d   iSkip = PAGER_M
31a80 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 20  J_PGNO(pPager); 
31a90 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  /* Pending lock 
31aa0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
31ab0 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69 7a  const Pgno dbSiz
31ac0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
31ad0 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ze;       /* Dat
31ae0 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a 65  abase image size
31af0 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 70 50 61   */ .        pPa
31b00 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
31b10 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
31b20 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
31b30 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50  =dbSize+1; i<=pP
31b40 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
31b50 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
31b60 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
31b70 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
31b80 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
31b90 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
31ba0 20 20 20 20 20 20 20 20 20 20 20 20 50 67 48 64              PgHd
31bb0 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  r *pPage;       
31bc0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
31bd0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
31be0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31bf0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
31c00 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b  ger, i, &pPage);
31c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31c20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31c30 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31c40 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
31c50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
31c60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31c70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
31c80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
31c90 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
31ca0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31cb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
31cc0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
31cd0 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
31ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31cf0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
31d00 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b  dbSize = dbSize;
31d10 0a 20 20 20 20 20 20 7d 20 0a 20 20 23 65 6e 64  .      } .  #end
31d20 69 66 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 57  if.  .      /* W
31d30 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
31d40 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
31d50 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
31d60 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72 20  le. If a master 
31d70 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
31d80 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
31d90 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
31da0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
31db0 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 20  nal file, .     
31dc0 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65   ** or if zMaste
31dd0 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61  r is NULL (no ma
31de0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74  ster journal), t
31df0 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73  hen this call is
31e00 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20 20   a no-op..      
31e10 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  */.      rc = wr
31e20 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
31e30 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
31e40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
31e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
31e60 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
31e70 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20  ne_exit;.  .    
31e80 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
31e90 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
31ea0 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65  he atomic-update
31eb0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
31ec0 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
31ed0 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c 20  used, this call 
31ee0 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65 20  will not create 
31ef0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31f00 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79 0a   or perform any.
31f10 20 20 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f        ** real IO
31f20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31f30 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
31f40 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
31f50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31f60 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
31f70 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
31f80 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  .  .      /* Wri
31f90 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
31fa0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
31fb0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
31fc0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
31fd0 74 65 5f 70 61 67 65 6c 69 73 74 28 73 71 6c 69  te_pagelist(sqli
31fe0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
31ff0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
32000 68 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  he));.      if( 
32010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32020 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32030 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
32040 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  R_BLOCKED );.   
32050 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74       goto commit
32060 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
32070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
32080 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
32090 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
320a0 61 63 68 65 29 3b 0a 20 20 0a 20 20 20 20 20 20  ache);.  .      
320b0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  /* If the file o
320c0 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74 68  n disk is not th
320d0 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74  e same size as t
320e0 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
320f0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  e,.      ** then
32100 20 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e 63   use pager_trunc
32110 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20 73  ate to grow or s
32120 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20 68  hrink the file h
32130 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
32140 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
32150 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  dbSize!=pPager->
32160 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
32170 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20        Pgno nNew 
32180 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
32190 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69   - (pPager->dbSi
321a0 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ze==PAGER_MJ_PGN
321b0 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  O(pPager));.    
321c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
321d0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
321e0 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
321f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32200 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
32210 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
32220 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32230 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
32240 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
32250 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
32260 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79    /* Finally, sy
32270 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
32280 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  file. */.      i
32290 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
322a0 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
322b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
322c0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
322d0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
322e0 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
322f0 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41     }.      IOTRA
32300 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
32310 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
32320 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  }..    pPager->s
32330 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
32340 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74  CED;.  }..commit
32350 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a  _phase_one_exit:
32360 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32370 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
32380 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
32390 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62 61  lled, the databa
323a0 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
323b0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75   completely.** u
323c0 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
323d0 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61  t the changes ma
323e0 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  de by the curren
323f0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  t transaction an
32400 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64  d.** synced to d
32410 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  isk. The journal
32420 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73   file still exis
32430 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ts in the file-s
32440 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68  ystem .** though
32450 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c 75  , and if a failu
32460 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  re occurs at thi
32470 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20  s point it will 
32480 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65  eventually.** be
32490 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d 6a   used as a hot-j
324a0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 63  ournal and the c
324b0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
324c0 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  on rolled back..
324d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
324e0 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74 68  ion finalizes th
324f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
32500 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74 69  either by deleti
32510 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  ng, .** truncati
32520 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20  ng or partially 
32530 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74  zeroing it, so t
32540 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  hat it cannot be
32550 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f   used .** for ho
32560 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
32570 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69 73  ck. Once this is
32580 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73 61   done the transa
32590 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65  ction is.** irre
325a0 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65  vocably committe
325b0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
325c0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
325d0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
325e0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
325f0 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73  e pager.** moves
32600 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
32610 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
32620 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
32630 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
32640 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
32650 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72  itPhaseTwo(Pager
32660 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
32670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32690 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
326a0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
326b0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f  outine should no
326c0 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 61  t be called if a
326d0 20 70 72 69 6f 72 20 65 72 72 6f 72 20 68 61 73   prior error has
326e0 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
326f0 42 75 74 20 69 66 20 28 64 75 65 20 74 6f 20 61  But if (due to a
32700 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 65 6c   coding error el
32710 73 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 73  sewhere in the s
32720 79 73 74 65 6d 29 20 69 74 20 64 6f 65 73 20 67  ystem) it does g
32730 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20  et.  ** called, 
32740 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  just return the 
32750 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  same error code 
32760 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
32770 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  ything. */.  if(
32780 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
32790 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
327a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
327b0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
327c0 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74  ction should not
327d0 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68   be called if th
327e0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
327f0 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20  n at least.  ** 
32800 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
32810 74 61 74 65 2e 20 2a 2a 46 49 58 4d 45 2a 2a 3a  tate. **FIXME**:
32820 20 4d 61 6b 65 20 69 74 20 73 6f 20 74 68 61 74   Make it so that
32830 20 74 68 69 73 20 74 65 73 74 20 61 6c 77 61 79   this test alway
32840 73 0a 20 20 2a 2a 20 66 61 69 6c 73 20 2d 20 6d  s.  ** fails - m
32850 61 6b 65 20 69 74 20 73 6f 20 74 68 61 74 20 77  ake it so that w
32860 65 20 6e 65 76 65 72 20 72 65 61 63 68 20 74 68  e never reach th
32870 69 73 20 70 6f 69 6e 74 20 69 66 20 77 65 20 64  is point if we d
32880 6f 20 6e 6f 74 20 68 6f 6c 64 0a 20 20 2a 2a 20  o not hold.  ** 
32890 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  all necessary lo
328a0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
328b0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 73 74  NEVER(pPager->st
328c0 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
328d0 45 44 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ED) ) return SQL
328e0 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  ITE_ERROR;..  /*
328f0 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   An optimization
32900 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  . If the databas
32910 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  e was not actual
32920 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69  ly modified duri
32930 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72 61  ng.  ** this tra
32940 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70 61  nsaction, the pa
32950 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
32960 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
32970 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73 69   and is.  ** usi
32980 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  ng persistent jo
32990 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68 69  urnals, then thi
329a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
329b0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  no-op..  **.  **
329c0 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   The start of th
329d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
329e0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
329f0 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  s a single journ
32a00 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  al .  ** header 
32a10 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 66 69  with the nRec fi
32a20 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49 66  eld set to 0. If
32a30 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c 20   such a journal 
32a40 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a 20  is used as.  ** 
32a50 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64 75  a hot-journal du
32a60 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
32a70 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68 61   rollback, 0 cha
32a80 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64  nges will be mad
32a90 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61  e.  ** to the da
32aa0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20  tabase file. So 
32ab0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
32ac0 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f 75   to zero the jou
32ad0 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65  rnal .  ** heade
32ae0 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  r. Since the pag
32af0 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
32b00 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20 69  ve mode, there i
32b10 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20 74  s no need.  ** t
32b20 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b 73  o drop any locks
32b30 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20   either..  */.  
32b40 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  if( pPager->dbMo
32b50 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70 50 61  dified==0 && pPa
32b60 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
32b70 64 65 20 0a 20 20 20 26 26 20 70 50 61 67 65 72  de .   && pPager
32b80 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
32b90 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32ba0 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a 20 20  _PERSIST.  ){.  
32bb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32bc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
32bd0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
32be0 67 65 72 29 20 7c 7c 20 21 70 50 61 67 65 72 2d  ger) || !pPager-
32bf0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
32c00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32c10 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  _OK;.  }..  PAGE
32c20 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20  RTRACE(("COMMIT 
32c30 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
32c40 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65  Pager)));.  asse
32c50 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
32c60 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
32c70 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61  || MEMDB || !pPa
32c80 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
32c90 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
32ca0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
32cb0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
32cc0 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  setMaster);.  re
32cd0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
32ce0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
32cf0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
32d00 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54 68 65  all changes. The
32d10 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
32d20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
32d30 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ARED mode..**.**
32d40 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
32d50 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b  erforms two task
32d60 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74  s:.**.**   1) It
32d70 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20   rolls back the 
32d80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65  journal file, re
32d90 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74 61  storing all data
32da0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a  base file and .*
32db0 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  *      in-memory
32dc0 20 63 61 63 68 65 20 70 61 67 65 73 20 74 6f 20   cache pages to 
32dd0 74 68 65 20 73 74 61 74 65 20 74 68 65 79 20 77  the state they w
32de0 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68 65 20  ere in when the 
32df0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
32e00 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64 2c 20      was opened, 
32e10 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74 20 66  and.**   2) It f
32e20 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75  inalizes the jou
32e30 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68  rnal file, so th
32e40 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65  at it is not use
32e50 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20  d for hot.**    
32e60 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e    rollback at an
32e70 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  y point in the f
32e80 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62  uture..**.** sub
32e90 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ject to the foll
32ea0 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63 61 74  owing qualificat
32eb0 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  ions:.**.** * If
32ec0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32ed0 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  e is not yet ope
32ee0 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
32ef0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
32f00 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28  **   then only (
32f10 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  2) is performed.
32f20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
32f30 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61  ere is no journa
32f40 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72  l file.**   to r
32f50 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  oll back..**.** 
32f60 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72 6f 72  * If in an error
32f70 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
32f80 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74  n SQLITE_FULL, t
32f90 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69 73 20  hen task (1) is 
32fa0 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65 64 2e  .**   performed.
32fb0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
32fc0 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61 72 64  task (2). Regard
32fd0 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63  less of the outc
32fe0 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68  ome.**   of eith
32ff0 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20 73 74  er, the error st
33000 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
33010 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
33020 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69  e caller.**   (i
33030 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c 49 54  .e. either SQLIT
33040 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
33050 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
33060 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  * * If the pager
33070 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52 45 53   is in PAGER_RES
33080 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
33090 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20 57  n attempt (1). W
330a0 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e  hether.**   or n
330b0 6f 74 20 28 31 29 20 69 73 20 73 75 63 63 65 73  ot (1) is succes
330c0 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d  sful, also attem
330d0 70 74 20 28 32 29 2e 20 49 66 20 73 75 63 63 65  pt (2). If succe
330e0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
330f0 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74     SQLITE_OK. Ot
33100 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72 20 74  herwise, enter t
33110 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
33120 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 66 69  nd return the fi
33130 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20  rst .**   error 
33140 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72 65 64  code encountered
33150 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68  . .**.**   In th
33160 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
33170 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
33180 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
33190 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a   written to. .**
331a0 20 20 20 53 6f 20 69 73 20 73 61 66 65 20 74 6f     So is safe to
331b0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
331c0 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e 20  urnal file even 
331d0 69 66 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  if the playback 
331e0 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69 6f 6e  .**   (operation
331f0 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f 77 65   1) failed. Howe
33200 76 65 72 20 74 68 65 20 70 61 67 65 72 20 6d 75  ver the pager mu
33210 73 74 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  st enter the err
33220 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 61 73  or state.**   as
33230 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
33240 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
33250 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73 75 73  ache are now sus
33260 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69  pect..**.** * Fi
33270 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41 47  nally, if in PAG
33280 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61  ER_EXCLUSIVE sta
33290 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  te, then attempt
332a0 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20   (1). Only.**   
332b0 61 74 74 65 6d 70 74 20 28 32 29 20 69 66 20 28  attempt (2) if (
332c0 31 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  1) is successful
332d0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
332e0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
332f0 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69 73 65  ,.**   otherwise
33300 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
33310 20 73 74 61 74 65 20 61 6e 64 20 72 65 74 75 72   state and retur
33320 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
33330 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20   from the .**   
33340 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f  failing operatio
33350 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68  n..**.**   In th
33360 69 73 20 63 61 73 65 20 74 68 65 20 64 61 74 61  is case the data
33370 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20 68 61  base file may ha
33380 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
33390 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a  to. So if the.**
333a0 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72     playback oper
333b0 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75  ation did not su
333c0 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64 20 6e  cceed it would n
333d0 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20 66 69  ot be safe to fi
333e0 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20  nalize.**   the 
333f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
33400 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 65 66   needs to be lef
33410 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
33420 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20  stem so that.** 
33430 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f    some other pro
33440 63 65 73 73 20 63 61 6e 20 75 73 65 20 69 74 20  cess can use it 
33450 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
33460 61 74 61 62 61 73 65 20 73 74 61 74 65 20 28 62  atabase state (b
33470 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e  y.**   hot-journ
33480 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f  al rollback)..*/
33490 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
334a0 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
334b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
334c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
334d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
334f0 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  */.  PAGERTRACE(
33500 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
33510 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
33520 29 29 29 3b 0a 20 20 69 66 28 20 70 61 67 65 72  )));.  if( pager
33530 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
33540 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
33550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33560 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
33570 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49 4e 54  Pager, SAVEPOINT
33580 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31 29 3b 0a  _ROLLBACK, -1);.
33590 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
335a0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
335b0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
335c0 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  setMaster);.    
335d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
335e0 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
335f0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
33600 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
33610 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
33620 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
33630 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
33640 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72  r->jfd) ){.    r
33650 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
33660 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
33670 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
33680 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ter);.  }else if
33690 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
336a0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
336b0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
336c0 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
336d0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
336e0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
336f0 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
33700 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
33710 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
33720 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
33730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
33740 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
33750 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
33760 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b  {.      int rc2;
33770 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
33780 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
33790 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32  r, 0);.      rc2
337a0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
337b0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
337c0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
337d0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
337e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
337f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
33800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
33810 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
33820 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
33830 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
33840 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ..    if( !MEMDB
33850 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
33860 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
33870 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
33880 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
33890 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c  urs during a ROL
338a0 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f  LBACK, we can no
338b0 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68   longer trust th
338c0 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63  e pager.    ** c
338d0 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
338e0 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
338f0 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
33900 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
33910 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
33920 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
33930 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
33940 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  ger, rc);.  }.  
33950 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33960 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
33970 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
33980 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
33990 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
339a0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
339b0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
339c0 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
339d0 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65  le..*/.u8 sqlite
339e0 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
339f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
33a00 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
33a10 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
33a20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
33a30 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
33a40 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
33a50 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
33a60 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50  3PagerRefcount(P
33a70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
33a80 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
33a90 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
33aa0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
33ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33ac0 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20  the approximate 
33ad0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
33ae0 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  of memory curren
33af0 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74  tly.** used by t
33b00 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 74 73  he pager and its
33b10 20 61 73 73 6f 63 69 61 74 65 64 20 63 61 63 68   associated cach
33b20 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
33b30 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28 50 61  3PagerMemUsed(Pa
33b40 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
33b50 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a 65 20  int perPageSize 
33b60 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
33b70 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  ze + pPager->nEx
33b80 74 72 61 20 2b 20 32 30 3b 0a 20 20 72 65 74 75  tra + 20;.  retu
33b90 72 6e 20 70 65 72 50 61 67 65 53 69 7a 65 2a 73  rn perPageSize*s
33ba0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
33bb0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
33bc0 43 61 63 68 65 29 0a 20 20 20 20 20 20 20 20 20  Cache).         
33bd0 20 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f    + sqlite3Mallo
33be0 63 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d  cSize(pPager);.}
33bf0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33c00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
33c10 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
33c20 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
33c30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33c40 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44  erPageRefcount(D
33c50 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  bPage *pPage){. 
33c60 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
33c70 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
33c80 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66  t(pPage);.}..#if
33c90 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
33ca0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
33cb0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
33cc0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
33cd0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
33ce0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
33cf0 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
33d00 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
33d10 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
33d20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
33d30 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
33d40 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20  PCache);.  a[1] 
33d50 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  = sqlite3PcacheP
33d60 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
33d70 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32  >pPCache);.  a[2
33d80 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
33d90 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eGetCachesize(pP
33da0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
33db0 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
33dc0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28  >dbSizeValid ? (
33dd0 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53  int) pPager->dbS
33de0 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d  ize : -1;.  a[4]
33df0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
33e00 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
33e10 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b  r->errCode;.  a[
33e20 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
33e30 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
33e40 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
33e50 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20  ] = 0;  /* Used 
33e60 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f  to be pPager->nO
33e70 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20  vfl */.  a[9] = 
33e80 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
33e90 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
33ea0 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
33eb0 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n a;.}.#endif../
33ec0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
33ed0 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
33ee0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
33ef0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
33f00 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72  gerIsMemdb(Pager
33f10 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
33f20 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a  urn MEMDB;.}../*
33f30 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
33f40 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73  here are at leas
33f50 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76  t nSavepoint sav
33f60 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66  epoints open. If
33f70 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75   there are.** cu
33f80 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61  rrently less tha
33f90 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70  n nSavepoints op
33fa0 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e  en, then open on
33fb0 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
33fc0 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20  ints.** to make 
33fd0 75 70 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  up the differenc
33fe0 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  e. If the number
33ff0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69   of savepoints i
34000 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75  s already.** equ
34010 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74  al to nSavepoint
34020 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
34030 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
34040 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
34050 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
34060 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
34070 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  M is returned. I
34080 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
34090 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
340a0 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ing the sub-jour
340b0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61  nal file, then a
340c0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
340d0 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
340e0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
340f0 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
34100 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
34110 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
34120 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70  ager, int nSavep
34130 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
34140 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
34150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34160 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
34170 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72  e */.  int nCurr
34180 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  ent = pPager->nS
34190 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
341a0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62   /* Current numb
341b0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
341c0 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65   */..  if( nSave
341d0 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26  point>nCurrent &
341e0 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
341f0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
34200 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
34210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34220 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
34230 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
34240 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
34250 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  aNew;           
34260 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50          /* New P
34270 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
34280 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
34290 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
342a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
342b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
342c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
342d0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
342e0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
342f0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
34300 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
34310 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 2f  eturn rc;..    /
34320 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72  * Grow the Pager
34330 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
34340 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28  y using realloc(
34350 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
34360 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66  _NOMEM.    ** if
34370 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
34380 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65  fails. Otherwise
34390 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70  , zero the new p
343a0 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61  ortion in case a
343b0 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20   .    ** malloc 
343c0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
343d0 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  hile populating 
343e0 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e  it in the for(..
343f0 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20  .) loop below.. 
34400 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d     */.    aNew =
34410 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74   (PagerSavepoint
34420 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   *)sqlite3Reallo
34430 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  c(.        pPage
34440 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73  r->aSavepoint, s
34450 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
34460 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74  oint)*nSavepoint
34470 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
34480 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !aNew ){.      r
34490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
344a0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
344b0 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72  mset(&aNew[nCurr
344c0 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70  ent], 0, (nSavep
344d0 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a  oint-nCurrent) *
344e0 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
344f0 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50  epoint));.    pP
34500 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
34510 20 3d 20 61 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a   = aNew;..    /*
34520 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61   Populate the Pa
34530 67 65 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72  gerSavepoint str
34540 75 63 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c  uctures just all
34550 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66  ocated. */.    f
34560 6f 72 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20  or(ii=nCurrent; 
34570 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  ii<nSavepoint; i
34580 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 4e 65 77  i++){.      aNew
34590 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 6e 50 61  [ii].nOrig = nPa
345a0 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  ge;.      if( is
345b0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
345c0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
345d0 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20  rnalOff>0 ){.   
345e0 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
345f0 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
34600 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
34610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34620 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
34630 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  t = JOURNAL_HDR_
34640 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
34650 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69    }.      aNew[i
34660 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61  i].iSubRec = pPa
34670 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20  ger->nSubRec;.  
34680 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e      aNew[ii].pIn
34690 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69  Savepoint = sqli
346a0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
346b0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
346c0 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53  ( !aNew[ii].pInS
346d0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
346e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
346f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
34700 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72  .      if( pager
34710 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
34720 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34730 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 28 70 50  3WalSavepoint(pP
34740 61 67 65 72 2d 3e 70 57 61 6c 2c 20 61 4e 65 77  ager->pWal, aNew
34750 5b 69 69 5d 2e 61 57 61 6c 44 61 74 61 29 3b 0a  [ii].aWalData);.
34760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
34770 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
34780 20 3d 20 69 69 2b 31 3b 0a 20 20 20 20 7d 0a 20   = ii+1;.    }. 
34790 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
347a0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 6e  r->nSavepoint==n
347b0 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20  Savepoint );.   
347c0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
347d0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
347e0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
347f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
34800 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
34810 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  alled to rollbac
34820 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f  k or release (co
34830 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e  mmit) a savepoin
34840 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f  t..** The savepo
34850 69 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f  int to release o
34860 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20  r rollback need 
34870 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20  not be the most 
34880 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65  recently .** cre
34890 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a  ated savepoint..
348a0 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
348b0 6f 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74  op is always eit
348c0 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
348d0 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f  LLBACK or SAVEPO
348e0 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20  INT_RELEASE..** 
348f0 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
34900 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
34910 20 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73   release and des
34920 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69  troy the savepoi
34930 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78  nt with.** index
34940 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20   iSavepoint. If 
34950 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
34960 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72  ROLLBACK, then r
34970 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
34980 67 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ges.** that have
34990 20 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20   occurred since 
349a0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61  the specified sa
349b0 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61  vepoint was crea
349c0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ted..**.** The s
349d0 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c  avepoint to roll
349e0 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20  back or release 
349f0 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
34a00 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69   parameter .** i
34a10 53 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c  Savepoint. A val
34a20 75 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f  ue of 0 means to
34a30 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
34a40 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
34a50 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73  int.** (the firs
34a60 74 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61  t created). A va
34a70 6c 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53  lue of (Pager.nS
34a80 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e  avepoint-1) mean
34a90 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20  s operate.** on 
34aa0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
34ab0 79 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  y created savepo
34ac0 69 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69  int. If iSavepoi
34ad0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
34ae0 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61  an.** (Pager.nSa
34af0 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e  vepoint-1), then
34b00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
34b10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
34b20 20 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76   If a negative v
34b30 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74  alue is passed t
34b40 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
34b50 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
34b60 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
34b70 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
34b80 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
34b90 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a  nt to calling .*
34ba0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
34bb0 6c 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65  llback() because
34bc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
34bd0 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74  oes not terminat
34be0 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  e.** the transac
34bf0 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  tion or unlock t
34c00 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
34c10 6a 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68  just restores th
34c20 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
34c30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
34c40 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
34c50 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20  tate. .**.** In 
34c60 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61  any case, all sa
34c70 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e  vepoints with an
34c80 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
34c90 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a  han iSavepoint .
34ca0 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  ** are destroyed
34cb0 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  . If this is a r
34cc0 65 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e  elease operation
34cd0 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
34ce0 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65  RELEASE),.** the
34cf0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76  n savepoint iSav
34d00 65 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64  epoint is also d
34d10 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
34d20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
34d30 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
34d40 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72  NOMEM if a memor
34d50 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
34d60 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20  ls,.** or an IO 
34d70 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
34d80 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
34d90 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62   while rolling b
34da0 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f  ack a .** savepo
34db0 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  int. If no error
34dc0 73 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  s occur, SQLITE_
34dd0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
34de0 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  */ .int sqlite3P
34df0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61  agerSavepoint(Pa
34e00 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
34e10 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
34e20 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
34e30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
34e40 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
34e50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
34e60 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
34e70 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65  LLBACK );.  asse
34e80 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
34e90 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  0 || op==SAVEPOI
34ea0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a  NT_ROLLBACK );..
34eb0 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
34ec0 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
34ed0 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  int ){.    int i
34ee0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
34ef0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
34f00 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  le */.    int nN
34f10 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew;          /* 
34f20 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e  Number of remain
34f30 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ing savepoints a
34f40 66 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f  fter this op. */
34f50 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
34f60 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76  out how many sav
34f70 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69  epoints will sti
34f80 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74  ll be active aft
34f90 65 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f  er this.    ** o
34fa0 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20  peration. Store 
34fb0 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e  this value in nN
34fc0 65 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65  ew. Then free re
34fd0 73 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74  sources associat
34fe0 65 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ed .    ** with 
34ff0 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
35000 68 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65  hat are destroye
35010 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
35020 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
35030 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e  nNew = iSavepoin
35040 74 20 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 50  t + (( op==SAVEP
35050 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 3f  OINT_RELEASE ) ?
35060 20 30 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72   0 : 1);.    for
35070 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61  (ii=nNew; ii<pPa
35080 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
35090 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71   ii++){.      sq
350a0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
350b0 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
350c0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
350d0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
350e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
350f0 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20  point = nNew;.. 
35100 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
35110 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68   a release of th
35120 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65  e outermost save
35130 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20  point, truncate 
35140 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
35150 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20  journal to zero 
35160 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a  bytes in size. *
35170 2f 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41  /.    if( op==SA
35180 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
35190 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65  ){.      if( nNe
351a0 77 3d 3d 30 20 26 26 20 69 73 4f 70 65 6e 28 70  w==0 && isOpen(p
351b0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
351c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
351d0 74 72 75 6e 63 61 74 65 20 69 66 20 69 74 20 69  truncate if it i
351e0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  s an in-memory s
351f0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
35200 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
35210 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
35220 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
35230 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35240 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
35250 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30  (pPager->sjfd, 0
35260 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
35270 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
35280 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OK );.        }.
35290 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
352a0 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20  nSubRec = 0;.   
352b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
352c0 2a 20 45 6c 73 65 20 74 68 69 73 20 69 73 20 61  * Else this is a
352d0 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
352e0 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68  ion, playback th
352f0 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
35300 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66  point..    ** If
35310 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d   this is a temp-
35320 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73  file, it is poss
35330 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ible that the jo
35340 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20  urnal file has. 
35350 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65     ** not yet be
35360 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68  en opened. In th
35370 69 73 20 63 61 73 65 20 74 68 65 72 65 20 68 61  is case there ha
35380 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
35390 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  es to.    ** the
353a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
353b0 73 6f 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  so the playback 
353c0 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65  operation can be
353d0 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f   skipped..    */
353e0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 61  .    else if( pa
353f0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
35400 29 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  ) || isOpen(pPag
35410 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
35420 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
35430 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28   *pSavepoint = (
35440 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67  nNew==0)?0:&pPag
35450 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e  er->aSavepoint[n
35460 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63  New-1];.      rc
35470 20 3d 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b   = pagerPlayback
35480 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72  Savepoint(pPager
35490 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , pSavepoint);. 
354a0 20 20 20 20 20 61 73 73 65 72 74 28 72 63 21 3d       assert(rc!=
354b0 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20  SQLITE_DONE);.  
354c0 20 20 7d 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74    }.  .  }.  ret
354d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
354e0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
354f0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
35500 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
35510 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
35520 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
35530 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
35540 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
35550 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
35560 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
35570 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
35580 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
35590 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
355a0 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
355b0 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
355c0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
355d0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
355e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
355f0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  e file handle fo
35600 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
35610 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ile associated.*
35620 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72  * with the pager
35630 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65  .  This might re
35640 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
35650 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74   file has.** not
35660 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
35670 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c  ..*/.sqlite3_fil
35680 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  e *sqlite3PagerF
35690 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ile(Pager *pPage
356a0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
356b0 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger->fd;.}../*.*
356c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
356d0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
356e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
356f0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
35700 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
35710 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
35720 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
35730 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
35740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
35750 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
35760 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
35770 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
35780 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
35790 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
357a0 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
357b0 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
357c0 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
357d0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
357e0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
357f0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
35800 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
35810 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
35820 20 6f 72 20 72 65 74 72 69 65 76 65 20 74 68 65   or retrieve the
35830 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
35840 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
35850 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64  lite3PagerSetCod
35860 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
35870 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
35880 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
35890 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
358a0 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a  void (*xCodecSiz
358b0 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74  eChng)(void*,int
358c0 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ,int),.  void (*
358d0 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
358e0 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  *),.  void *pCod
358f0 65 63 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ec.){.  if( pPag
35900 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29  er->xCodecFree )
35910 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
35920 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  ree(pPager->pCod
35930 65 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78  ec);.  pPager->x
35940 43 6f 64 65 63 20 3d 20 70 50 61 67 65 72 2d 3e  Codec = pPager->
35950 6d 65 6d 44 62 20 3f 20 30 20 3a 20 78 43 6f 64  memDb ? 0 : xCod
35960 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  ec;.  pPager->xC
35970 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 3d 20 78  odecSizeChng = x
35980 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20  CodecSizeChng;. 
35990 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
359a0 72 65 65 20 3d 20 78 43 6f 64 65 63 46 72 65 65  ree = xCodecFree
359b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
359c0 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70  ec = pCodec;.  p
359d0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
359e0 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 2a  Pager);.}.void *
359f0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 43  sqlite3PagerGetC
35a00 6f 64 65 63 28 50 61 67 65 72 20 2a 70 50 61 67  odec(Pager *pPag
35a10 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
35a20 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a  ager->pCodec;.}.
35a30 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
35a40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
35a50 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
35a60 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74  e the page pPg t
35a70 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
35a80 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  in the file..**.
35a90 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
35aa0 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
35ab0 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  o the page previ
35ac0 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
35ad0 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20  .** pgno (which 
35ae0 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20  we call pPgOld) 
35af0 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65  though that page
35b00 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
35b10 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20  e.** in cache.  
35b20 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76  If the page prev
35b30 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61  iously located a
35b40 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  t pgno is not al
35b50 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20  ready.** in the 
35b60 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
35b70 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20  , it is not put 
35b80 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73  there by by this
35b90 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
35ba0 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
35bb0 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69  e page pPg remai
35bc0 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
35bd0 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
35be0 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
35bf0 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74  th pPg (i.e. dat
35c00 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
35c10 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
35c20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
35c30 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
35c40 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
35c50 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
35c60 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
35c70 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
35c80 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
35c90 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
35ca0 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
35cb0 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
35cc0 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
35cd0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
35ce0 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
35cf0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
35d00 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
35d10 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
35d20 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
35d30 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
35d40 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
35d50 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
35d60 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
35d70 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c  fourth argument,
35d80 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f   isCommit, is no
35d90 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n-zero, then thi
35da0 73 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a  s page is being.
35db0 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74  ** moved as part
35dc0 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72   of a database r
35dd0 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75  eorganization ju
35de0 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  st before the tr
35df0 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  ansaction .** is
35e00 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
35e10 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
35e20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
35e30 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
35e40 73 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20  se page .** pPg 
35e50 72 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e  refers to will n
35e60 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ot be written to
35e70 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
35e80 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
35e90 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
35ea0 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
35eb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61  QLITE_NOMEM or a
35ec0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
35ed0 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f  if an error.** o
35ee0 63 63 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65  ccurs. Otherwise
35ef0 2c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  , it returns SQL
35f00 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
35f10 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
35f20 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
35f30 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
35f40 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69  Pgno pgno, int i
35f50 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64  sCommit){.  PgHd
35f60 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20  r *pPgOld;      
35f70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
35f80 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77  page being overw
35f90 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e  ritten. */.  Pgn
35fa0 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
35fb0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64   0;       /* Old
35fc0 20 76 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70   value of pPg->p
35fd0 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 20  gno, if sync is 
35fe0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
35ff0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
36000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
36010 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
36020 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20  gno origPgno;   
36030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
36040 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
36050 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73   number */..  as
36060 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
36070 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6f 72  0 );..  /* In or
36080 64 65 72 20 74 6f 20 62 65 20 61 62 6c 65 20 74  der to be able t
36090 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 6e 20 69  o rollback, an i
360a0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
360b0 65 20 6d 75 73 74 20 6a 6f 75 72 6e 61 6c 0a 20  e must journal. 
360c0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 65 20   ** the page we 
360d0 61 72 65 20 6d 6f 76 69 6e 67 20 66 72 6f 6d 2e  are moving from.
360e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
360f0 42 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  B ){.    rc = sq
36100 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36110 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
36120 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36130 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
36140 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20  age being moved 
36150 69 73 20 64 69 72 74 79 20 61 6e 64 20 68 61 73  is dirty and has
36160 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20   not been saved 
36170 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20  by the latest.  
36180 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68  ** savepoint, th
36190 65 6e 20 73 61 76 65 20 74 68 65 20 63 75 72 72  en save the curr
361a0 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
361b0 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
361c0 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  e .  ** sub-jour
361d0 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  nal now. This is
361e0 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
361f0 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  dle the followin
36200 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a  g scenario:.  **
36210 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20  .  **   BEGIN;. 
36220 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c   **     <journal
36230 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f   page X, then mo
36240 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72  dify it in memor
36250 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45  y>.  **     SAVE
36260 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20  POINT one;.  ** 
36270 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65        <Move page
36280 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59   X to location Y
36290 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42  >.  **     ROLLB
362a0 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a  ACK TO one;.  **
362b0 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20  .  ** If page X 
362c0 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e  were not written
362d0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
362e0 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75  nal here, it wou
362f0 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70  ld not.  ** be p
36300 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f  ossible to resto
36310 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20  re its contents 
36320 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
36330 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20  CK TO one".  ** 
36340 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69  statement were i
36350 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  s processed..  *
36360 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61  *.  ** subjourna
36370 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64  lPage() may need
36380 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
36390 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d  ce to store pPg-
363a0 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20  >pgno into.  ** 
363b0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
363c0 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54  point bitvecs. T
363d0 68 69 73 20 69 73 20 74 68 65 20 72 65 61 73 6f  his is the reaso
363e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
363f0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
36400 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20  SQLITE_NOMEM..  
36410 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  */.  if( pPg->fl
36420 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 0a  ags&PGHDR_DIRTY.
36430 20 20 20 26 26 20 73 75 62 6a 52 65 71 75 69 72     && subjRequir
36440 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 26  esPage(pPg).   &
36450 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
36460 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
36470 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20  e(pPg)).  ){.   
36480 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
36490 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
364a0 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20  MOVE %d page %d 
364b0 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f  (needSync=%d) mo
364c0 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20  ves to %d\n", . 
364d0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
364e0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
364f0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
36500 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
36510 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54  0, pgno));.  IOT
36520 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
36530 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
36540 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
36550 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ))..  /* If the 
36560 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
36570 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
36580 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ore page pPg->pg
36590 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77  no can.  ** be w
365a0 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65  ritten to, store
365b0 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f   pPg->pgno in lo
365c0 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65  cal variable nee
365d0 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a  dSyncPgno..  **.
365e0 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f    ** If the isCo
365f0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
36600 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
36610 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
36620 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75  hat.  ** the jou
36630 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
36640 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
36650 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
36660 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63  Pg->pgno .  ** c
36670 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
36680 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
36690 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
366a0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
366b0 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o it..  */.  if(
366c0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
366d0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26  DR_NEED_SYNC) &&
366e0 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20   !isCommit ){.  
366f0 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
36700 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
36710 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f  assert( pageInJo
36720 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50  urnal(pPg) || pP
36730 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
36740 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20  dbOrigSize );.  
36750 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
36760 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
36770 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36780 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
36790 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
367a0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
367b0 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
367c0 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
367d0 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
367e0 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
367f0 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
36800 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
36810 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
36820 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
36830 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
36840 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
36850 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
36860 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
36870 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
36880 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66  e..  */.  pPg->f
36890 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
368a0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f  EED_SYNC;.  pPgO
368b0 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
368c0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
368d0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 4f  .  assert( !pPgO
368e0 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52  ld || pPgOld->nR
368f0 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ef==1 );.  if( p
36900 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67  PgOld ){.    pPg
36910 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f  ->flags |= (pPgO
36920 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ld->flags&PGHDR_
36930 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20  NEED_SYNC);.    
36940 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
36950 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 69 73     /* Do not dis
36960 63 61 72 64 20 70 61 67 65 73 20 66 72 6f 6d 20  card pages from 
36970 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
36980 61 62 61 73 65 20 73 69 6e 63 65 20 77 65 20 6d  abase since we m
36990 69 67 68 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65  ight.      ** ne
369a0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c  ed to rollback l
369b0 61 74 65 72 2e 20 20 4a 75 73 74 20 6d 6f 76 65  ater.  Just move
369c0 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 6f 66   the page out of
369d0 20 74 68 65 20 77 61 79 2e 20 2a 2f 0a 20 20 20   the way. */.   
369e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
369f0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
36a00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
36a10 63 61 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64  cacheMove(pPgOld
36a20 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
36a30 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  +1);.    }else{.
36a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
36a50 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b  cheDrop(pPgOld);
36a60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6f 72  .    }.  }..  or
36a70 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  igPgno = pPg->pg
36a80 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  no;.  sqlite3Pca
36a90 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e  cheMove(pPg, pgn
36aa0 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  o);.  sqlite3Pca
36ab0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
36ac0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  );.  pPager->dbM
36ad0 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20  odified = 1;..  
36ae0 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
36af0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
36b00 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
36b10 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
36b20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
36b30 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
36b40 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
36b50 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
36b60 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
36b70 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
36b80 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
36b90 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
36ba0 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
36bb0 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
36bc0 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
36bd0 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22  * "is journaled"
36be0 20 62 69 74 76 65 63 20 66 6c 61 67 20 68 61 73   bitvec flag has
36bf0 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
36c00 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
36c10 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c  died by.    ** l
36c20 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 20  oading the page 
36c30 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
36c40 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
36c50 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
36c60 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67  ync .    ** flag
36c70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
36c80 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  If the attempt t
36c90 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20  o load the page 
36ca0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61  into the page-ca
36cb0 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a  che fails, (due.
36cc0 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c      ** to a mall
36cd0 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75  oc() or IO failu
36ce0 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62  re), clear the b
36cf0 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75  it in the pInJou
36d00 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72  rnal[].    ** ar
36d10 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
36d20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6c  if the page is l
36d30 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74 74 65  oaded and writte
36d40 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a  n again in.    *
36d50 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
36d60 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72  on, it may be wr
36d70 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
36d80 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
36d90 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73  e.    ** it is s
36da0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a  ynced into the j
36db0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
36dc0 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e  s way, it may en
36dd0 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74  d up in.    ** t
36de0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
36df0 74 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20  twice, but that 
36e00 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
36e10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
36e20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  The sqlite3Pager
36e30 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  Get() call may c
36e40 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
36e50 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
36e60 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
36e70 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
36e80 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
36e90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48  ..    */.    PgH
36ea0 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
36eb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36ec0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
36ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36ee0 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
36ef0 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
36f00 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
36f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36f20 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
36f30 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno<=pPager->db
36f40 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
36f50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36f60 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 21 3d 30  er->pTmpSpace!=0
36f70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
36f80 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70  te3BitvecClear(p
36f90 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36fa0 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  l, needSyncPgno,
36fb0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
36fc0 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ce);.      }.   
36fd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
36fe0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
36ff0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
37000 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37010 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21  ->noSync==0 && !
37020 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67  MEMDB );.    pPg
37030 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  Hdr->flags |= PG
37040 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
37050 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
37060 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72  MakeDirty(pPgHdr
37070 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
37080 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
37090 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
370a0 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
370b0 79 20 64 61 74 61 62 61 73 65 2c 20 6d 61 6b 65  y database, make
370c0 20 73 75 72 65 20 74 68 65 20 6f 72 69 67 69 6e   sure the origin
370d0 61 6c 20 70 61 67 65 20 63 6f 6e 74 69 6e 75 65  al page continue
370e0 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c  s.  ** to exist,
370f0 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61   in case the tra
37100 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
37110 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 55 73  o roll back.  Us
37120 65 20 70 50 67 4f 6c 64 0a 20 20 2a 2a 20 61 73  e pPgOld.  ** as
37130 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
37140 67 65 20 73 69 6e 63 65 20 69 74 20 68 61 73 20  ge since it has 
37150 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
37160 6f 63 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  ocated..  */.  i
37170 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
37180 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76  sqlite3PcacheMov
37190 65 28 70 50 67 4f 6c 64 2c 20 6f 72 69 67 50 67  e(pPgOld, origPg
371a0 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  no);.    sqlite3
371b0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 4f 6c  PagerUnref(pPgOl
371c0 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  d);.  }..  retur
371d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
371e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
371f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
37200 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
37210 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
37220 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
37230 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
37240 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61  bPage *pPg){.  a
37250 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
37260 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  >0 || pPg->pPage
37270 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65  r->memDb );.  re
37280 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b  turn pPg->pData;
37290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
372a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
372b0 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  e Pager.nExtra b
372c0 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20  ytes of "extra" 
372d0 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  space .** alloca
372e0 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
372f0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
37300 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
37310 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
37320 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
37330 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 45 78   return pPg->pEx
37340 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  tra;.}../*.** Ge
37350 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e  t/set the lockin
37360 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  g-mode for this 
37370 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
37380 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
37390 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c  ne.** of PAGER_L
373a0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
373b0 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  , PAGER_LOCKINGM
373c0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a  ODE_NORMAL or .*
373d0 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
373e0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49  ODE_EXCLUSIVE. I
373f0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
37400 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
37410 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69  hen.** the locki
37420 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  ng-mode is set t
37430 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
37440 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
37450 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
37460 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f  is either PAGER_
37470 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
37480 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c  AL or.** PAGER_L
37490 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
374a0 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIVE, indicating
374b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
374c0 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
374d0 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e  ** locking-mode.
374e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
374f0 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
37500 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
37510 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
37520 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
37530 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
37540 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
37550 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
37560 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
37570 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  AL.            |
37580 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
37590 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
375a0 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
375b0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
375c0 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
375d0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
375e0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
375f0 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f  L>=0 && PAGER_LO
37600 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
37610 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IVE>=0 );.  if( 
37620 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61  eMode>=0 && !pPa
37630 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
37640 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
37650 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
37660 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65  )eMode;.  }.  re
37670 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
37680 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  ->exclusiveMode;
37690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
376a0 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66  e journal-mode f
376b0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
376c0 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
376d0 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a  ust be one of:.*
376e0 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  *.**    PAGER_JO
376f0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
37700 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
37710 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
37720 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  E.**    PAGER_JO
37730 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
37740 54 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  T.**    PAGER_JO
37750 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a  URNALMODE_OFF.**
37760 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
37770 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20  LMODE_MEMORY.** 
37780 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
37790 4d 4f 44 45 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 54  MODE_WAL.**.** T
377a0 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 69  he journalmode i
377b0 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
377c0 75 65 20 73 70 65 63 69 66 69 65 64 20 69 66 20  ue specified if 
377d0 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 61 6c  the change is al
377e0 6c 6f 77 65 64 2e 0a 2a 2a 20 54 68 65 20 63 68  lowed..** The ch
377f0 61 6e 67 65 20 6d 61 79 20 62 65 20 64 69 73 61  ange may be disa
37800 6c 6c 6f 77 65 64 20 66 6f 72 20 74 68 65 20 66  llowed for the f
37810 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73  ollowing reasons
37820 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  :.**.**   *  An 
37830 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
37840 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65  se can only have
37850 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   its journal_mod
37860 65 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a  e set to _OFF.**
37870 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59        or _MEMORY
37880 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 65 6d  ..**.**   *  Tem
37890 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
378a0 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 5f 57 41   cannot have _WA
378b0 4c 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 2e 0a 2a  L journalmode..*
378c0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
378d0 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63  d indicate the c
378e0 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
378f0 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61   updated) journa
37900 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l-mode..*/.int s
37910 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f  qlite3PagerSetJo
37920 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20  urnalMode(Pager 
37930 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
37940 64 65 29 7b 0a 20 20 75 38 20 65 4f 6c 64 20 3d  de){.  u8 eOld =
37950 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37960 4d 6f 64 65 3b 20 20 20 20 2f 2a 20 50 72 69 6f  Mode;    /* Prio
37970 72 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 2a 2f  r journalmode */
37980 0a 0a 20 20 2f 2a 20 54 68 65 20 65 4d 6f 64 65  ..  /* The eMode
37990 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6c   parameter is al
379a0 77 61 79 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  ways valid */.  
379b0 61 73 73 65 72 74 28 20 20 20 20 20 20 65 4d 6f  assert(      eMo
379c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
379d0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20  LMODE_DELETE.   
379e0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
379f0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
37a00 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20  MODE_TRUNCATE.  
37a10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
37a20 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
37a30 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
37a40 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
37a50 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
37a60 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
37a70 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
37a80 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
37a90 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20  DE_WAL .        
37aa0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
37ab0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37ac0 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 2f 2a 20  MEMORY );..  /* 
37ad0 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65  Do not allow the
37ae0 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 6f 66 20   journalmode of 
37af0 61 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  a TEMP database 
37b00 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  to be changed to
37b10 20 57 41 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20   WAL.  */.  if( 
37b20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
37b30 20 26 26 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   && eMode==PAGER
37b40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
37b50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
37b60 65 4f 6c 64 21 3d 50 41 47 45 52 5f 4a 4f 55 52  eOld!=PAGER_JOUR
37b70 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 3b 0a 20  NALMODE_WAL );. 
37b80 20 20 20 65 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b     eMode = eOld;
37b90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6c  .  }..  /* Do al
37ba0 6c 6f 77 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6d  low the journalm
37bb0 6f 64 65 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d  ode of an in-mem
37bc0 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 6f 20  ory database to 
37bd0 62 65 20 73 65 74 20 74 6f 0a 20 20 2a 2a 20 61  be set to.  ** a
37be0 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
37bf0 61 6e 20 4d 45 4d 4f 52 59 20 6f 72 20 4f 46 46  an MEMORY or OFF
37c00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
37c10 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
37c20 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55   eOld==PAGER_JOU
37c30 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
37c40 7c 7c 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a  || eOld==PAGER_J
37c50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
37c60 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 21  ;.    if( eMode!
37c70 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
37c80 44 45 5f 4d 45 4d 4f 52 59 20 26 26 20 65 4d 6f  DE_MEMORY && eMo
37c90 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
37ca0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
37cb0 20 20 20 65 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b     eMode = eOld;
37cc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
37cd0 28 20 65 4d 6f 64 65 21 3d 65 4f 6c 64 20 29 7b  ( eMode!=eOld ){
37ce0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 63 68 61  .    /* When cha
37cf0 6e 67 69 6e 67 20 62 65 74 77 65 65 6e 20 72 6f  nging between ro
37d00 6c 6c 62 61 63 6b 20 6d 6f 64 65 73 2c 20 63 6c  llback modes, cl
37d10 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
37d20 66 69 6c 65 20 70 72 69 6f 72 0a 20 20 20 20 2a  file prior.    *
37d30 2a 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 2e  * to the change.
37d40 20 20 42 75 74 20 77 68 65 6e 20 63 68 61 6e 67    But when chang
37d50 69 6e 67 20 66 72 6f 6d 20 61 20 72 6f 6c 6c 62  ing from a rollb
37d60 61 63 6b 20 6d 6f 64 65 20 74 6f 20 57 41 4c 2c  ack mode to WAL,
37d70 20 6b 65 65 70 0a 20 20 20 20 2a 2a 20 74 68 65   keep.    ** the
37d80 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 73 69   journal open si
37d90 6e 63 65 20 74 68 65 72 65 20 69 73 20 61 20 72  nce there is a r
37da0 6f 6c 6c 62 61 63 6b 2d 73 74 79 6c 65 20 74 72  ollback-style tr
37db0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 6c 61  ansaction in pla
37dc0 79 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 74 6f  y.    ** used to
37dd0 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76 65 72   convert the ver
37de0 73 69 6f 6e 20 6e 75 6d 62 65 72 73 20 69 6e 20  sion numbers in 
37df0 74 68 65 20 62 74 72 65 65 20 68 65 61 64 65 72  the btree header
37e00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
37e10 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
37e20 6a 66 64 29 20 26 26 20 65 4d 6f 64 65 21 3d 50  jfd) && eMode!=P
37e30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37e40 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71  _WAL ){.      sq
37e50 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
37e60 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
37e70 0a 0a 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20  ..    /* Change 
37e80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  the journal mode
37e90 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
37ea0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28  >journalMode = (
37eb0 75 38 29 65 4d 6f 64 65 3b 0a 0a 20 20 20 20 2f  u8)eMode;..    /
37ec0 2a 20 57 68 65 6e 20 74 72 61 6e 73 69 73 74 69  * When transisti
37ed0 6f 6e 69 6e 67 20 66 72 6f 6d 20 54 52 55 4e 43  oning from TRUNC
37ee0 41 54 45 20 6f 72 20 50 45 52 53 49 53 54 20 74  ATE or PERSIST t
37ef0 6f 20 61 6e 79 20 6f 74 68 65 72 20 6a 6f 75 72  o any other jour
37f00 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20  nal.    ** mode 
37f10 65 78 63 65 70 74 20 57 41 4c 20 28 61 6e 64 20  except WAL (and 
37f20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 6c 6f  we are not in lo
37f30 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
37f40 53 49 56 45 29 20 74 68 65 6e 20 0a 20 20 20 20  SIVE) then .    
37f50 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  ** delete the jo
37f60 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
37f70 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
37f80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37f90 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d  E_TRUNCATE & 5)=
37fa0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
37fb0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
37fc0 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 26 20 35  MODE_PERSIST & 5
37fd0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
37fe0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
37ff0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 26 20  ALMODE_DELETE & 
38000 35 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  5)==0 );.    ass
38010 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
38020 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26  NALMODE_MEMORY &
38030 20 35 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73   5)==4 );.    as
38040 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
38050 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 26 20 35  RNALMODE_OFF & 5
38060 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
38070 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
38080 41 4c 4d 4f 44 45 5f 57 41 4c 20 26 20 35 29 3d  ALMODE_WAL & 5)=
38090 3d 35 20 29 3b 0a 0a 20 20 20 20 61 73 73 65 72  =5 );..    asser
380a0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
380b0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
380c0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
380d0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
380e0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
380f0 20 26 26 20 28 65 4f 6c 64 20 26 20 35 29 3d 3d   && (eOld & 5)==
38100 31 20 26 26 20 28 65 4d 6f 64 65 20 26 20 31 29  1 && (eMode & 1)
38110 3d 3d 30 20 29 7b 0a 0a 20 20 20 20 20 20 2f 2a  ==0 ){..      /*
38120 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
38130 20 77 6f 75 6c 64 20 6c 69 6b 65 20 74 6f 20 64   would like to d
38140 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
38150 6c 20 66 69 6c 65 2e 20 49 66 20 69 74 20 69 73  l file. If it is
38160 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 70 6f  .      ** not po
38170 73 73 69 62 6c 65 2c 20 74 68 65 6e 20 74 68 61  ssible, then tha
38180 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  t is not a probl
38190 65 6d 2e 20 44 65 6c 65 74 69 6e 67 20 74 68 65  em. Deleting the
381a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
381b0 20 20 20 20 2a 2a 20 68 65 72 65 20 69 73 20 61      ** here is a
381c0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  n optimization o
381d0 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  nly..      **.  
381e0 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 64 65      ** Before de
381f0 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  leting the journ
38200 61 6c 20 66 69 6c 65 2c 20 6f 62 74 61 69 6e 20  al file, obtain 
38210 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
38220 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  on the.      ** 
38230 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
38240 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
38250 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
38260 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
38270 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  .      ** while 
38280 69 74 20 69 73 20 69 6e 20 75 73 65 20 62 79 20  it is in use by 
38290 73 6f 6d 65 20 6f 74 68 65 72 20 63 6c 69 65 6e  some other clien
382a0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
382b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
382c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20  E_OK;.      int 
382d0 73 74 61 74 65 20 3d 20 70 50 61 67 65 72 2d 3e  state = pPager->
382e0 73 74 61 74 65 3b 0a 20 20 20 20 20 20 69 66 28  state;.      if(
382f0 20 73 74 61 74 65 3c 50 41 47 45 52 5f 53 48 41   state<PAGER_SHA
38300 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72  RED ){.        r
38310 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
38320 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65  SharedLock(pPage
38330 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
38340 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
38350 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
38360 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  D ){.        ass
38370 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
38380 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
38390 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
383a0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
383b0 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
383c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
383d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
383e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
383f0 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
38400 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
38410 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
38420 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
38430 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
38440 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
38450 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ED ){.        sq
38460 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
38470 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
38480 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 65  _LOCK);.      }e
38490 6c 73 65 20 69 66 28 20 73 74 61 74 65 3d 3d 50  lse if( state==P
384a0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
384b0 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c         pager_unl
384c0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
384d0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
384e0 74 28 20 73 74 61 74 65 3d 3d 70 50 61 67 65 72  t( state==pPager
384f0 2d 3e 73 74 61 74 65 20 29 3b 0a 20 20 20 20 7d  ->state );.    }
38500 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
38510 6e 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  n the new journa
38520 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20 72 65 74 75  l mode */.  retu
38530 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
38540 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a  journalMode;.}..
38550 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
38560 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
38570 20 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   mode..*/.int sq
38580 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75  lite3PagerGetJou
38590 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a  rnalMode(Pager *
385a0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
385b0 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a  n (int)pPager->j
385c0 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f  ournalMode;.}../
385d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
385e0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
385f0 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72   in a state wher
38600 65 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 63 68  e it is OK to ch
38610 61 6e 67 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ange the.** jour
38620 6e 61 6c 6d 6f 64 65 2e 20 20 4a 6f 75 72 6e 61  nalmode.  Journa
38630 6c 6d 6f 64 65 20 63 68 61 6e 67 65 73 20 63 61  lmode changes ca
38640 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 68  n only happen wh
38650 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  en the database.
38660 2a 2a 20 69 73 20 75 6e 6d 6f 64 69 66 69 65 64  ** is unmodified
38670 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
38680 50 61 67 65 72 4f 6b 54 6f 43 68 61 6e 67 65 4a  PagerOkToChangeJ
38690 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72  ournalMode(Pager
386a0 20 2a 70