/ Hex Artifact Content
Login

Artifact 926ca1019334d53e2c0cf9e44d32ad4564cf8948:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b 57    u32 aWalData[W
2660: 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44 41  AL_SAVEPOINT_NDA
2670: 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  TA];        /* W
2680: 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f 6e  AL savepoint con
2690: 74 65 78 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  text */.};../*.*
26a0: 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61  * A open page ca
26b0: 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  che is an instan
26c0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
26d0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
26e0: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
26f0: 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f  **   Pager.errCo
2700: 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  de may be set to
2710: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
2720: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
2730: 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45  r.**   or SQLITE
2740: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
2750: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
2760: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
2770: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
2780: 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e     and is return
2790: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
27a0: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
27b0: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
27c0: 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45   The.**   SQLITE
27d0: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
27e0: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
27f0: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
2800: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
2810: 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75  the.**   next su
2820: 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63  ccessful rollbac
2830: 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  k is performed o
2840: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
2850: 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51  e. Also,.**   SQ
2860: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
2870: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
2880: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2890: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
28a0: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50  Lookup().**   AP
28b0: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
28c0: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
28d0: 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64  ssfully..**.** d
28e0: 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69  bSizeValid, dbSi
28f0: 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20  ze, dbOrigSize, 
2900: 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbFileSize.**.**
2910: 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20     Managing the 
2920: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2930: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
2940: 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63  es is a little c
2950: 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20  omplicated..**  
2960: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
2970: 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61  ger.dbSize conta
2980: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
2990: 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65  f pages that the
29a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69   database.**   i
29b0: 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63  mage currently c
29c0: 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20  ontains. As the 
29d0: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67  database image g
29e0: 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20  rows or shrinks 
29f0: 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62  this.**   variab
2a00: 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54  le is updated. T
2a10: 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65  he variable Page
2a20: 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  r.dbFileSize con
2a30: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
2a40: 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69  .**   of pages i
2a50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a60: 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ile. This may be
2a70: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
2a80: 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20  Pager.dbSize.** 
2a90: 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20    if some pages 
2aa0: 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64  have been append
2ab0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
2ac0: 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74  se image but not
2ad0: 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20   yet written.** 
2ae0: 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63    out from the c
2af0: 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75  ache to the actu
2b00: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
2b10: 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65   Or if the image
2b20: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74   has been.**   t
2b30: 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69  runcated by an i
2b40: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2b50: 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  m operation. The
2b60: 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a   Pager.dbOrigSiz
2b70: 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  e variable.**   
2b80: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
2b90: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2ba0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2bb0: 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ge when the curr
2bc0: 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63  ent.**   transac
2bd0: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
2be0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2bf0: 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68   all three of th
2c00: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73  ese variables is
2c10: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61  .**   only guara
2c20: 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72  nteed to be corr
2c30: 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65  ect if the boole
2c40: 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56  an Pager.dbSizeV
2c50: 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a  alid is true..**
2c60: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65  .**   TODO: Unde
2c70: 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e  r what condition
2c80: 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64  s is dbSizeValid
2c90: 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a   set? Cleared?.*
2ca0: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
2cb0: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
2cc0: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
2cd0: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
2ce0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
2cf0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2d00: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
2d10: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
2d20: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
2d30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d40: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
2d50: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
2d60: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
2d70: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
2d80: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
2d90: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
2da0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2db0: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
2dc0: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
2dd0: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
2de0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
2df0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2e00: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2e10: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
2e20: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
2e30: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
2e40: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
2e50: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
2e60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e70: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
2e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2e90: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
2ea0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
2eb0: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
2ec0: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
2ed0: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
2ee0: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
2ef0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2f00: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
2f10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2f20: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
2f30: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
2f40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
2f50: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2f60: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
2f70: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
2f80: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
2f90: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2fa0: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
2fb0: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
2fc0: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
2fd0: 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66  d..**.** dbModif
2fe0: 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ied.**.**   The 
2ff0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
3000: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3010: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3020: 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20  is dirtied..**  
3030: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61   It is cleared a
3040: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
3050: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  h transaction..*
3060: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65  *.**   It is use
3070: 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  d when committin
3080: 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65  g or otherwise e
3090: 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  nding a transact
30a0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65  ion. If.**   the
30b0: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
30c0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c   is clear then l
30d0: 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20  ess work has to 
30e0: 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a  be done..**.** j
30f0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a  ournalStarted.**
3100: 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20  .**   This flag 
3110: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3120: 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  the the main jou
3130: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61  rnal is opened a
3140: 6e 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69  nd.**   initiali
3150: 7a 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  zed.**.**   The 
3160: 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c  point of this fl
3170: 61 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75  ag is that it mu
3180: 73 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20  st be set after 
3190: 74 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20  the .**   first 
31a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
31b0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
31c0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
31d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41   to disk..**   A
31e0: 66 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61  fter this has ha
31f0: 70 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65  ppened, new page
3200: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
3210: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20  e database .**  
3220: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65   do not need the
3230: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
3240: 20 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68   flag set, as th
3250: 65 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a  ey do not need.*
3260: 2a 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20  *   to wait for 
3270: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62  a journal sync b
3280: 65 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62  efore they can b
3290: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
32a0: 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61  .**   the databa
32b0: 73 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e  se file (see fun
32c0: 63 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74  ction pager_writ
32d0: 65 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73  e())..**   .** s
32e0: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
32f0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
3300: 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
3310: 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72   that the master
3320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
3330: 6d 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29  me.**   (if any)
3340: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
3350: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
3360: 6c 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a  l file once..**.
3370: 2a 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74  **   When commit
3380: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
3390: 6f 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  on, the master j
33a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
33b0: 20 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d   (if any).**   m
33c0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ay be written in
33d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
33e0: 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61  ile while the pa
33f0: 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a  ger is still in.
3400: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
3410: 56 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43  VED state (see C
3420: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
3430: 66 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e  for the action).
3440: 20 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74   It.**   then at
3450: 74 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64  tempts to upgrad
3460: 65 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  e to an exclusiv
3470: 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20  e lock. If this 
3480: 61 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69  attempt.**   fai
3490: 6c 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ls, then SQLITE_
34a0: 42 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75  BUSY may be retu
34b0: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
34c0: 20 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a   and the user.**
34d0: 20 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74     may attempt t
34e0: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
34f0: 6e 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c  nsaction again l
3500: 61 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a  ater (calling.**
3510: 20 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e     CommitPhaseOn
3520: 65 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73  e() again). This
3530: 20 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f   flag is used to
3540: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
3550: 20 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f   .**   master jo
3560: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e  urnal name is on
3570: 6c 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ly written to th
3580: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
3590: 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69  he first.**   ti
35a0: 6d 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  me CommitPhaseOn
35b0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
35c0: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c  *.** doNotSpill,
35d0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a   doNotSyncSpill.
35e0: 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61  **.**   When ena
35f0: 62 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c  bled, cache spil
3600: 6c 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ls are prohibite
3610: 64 2e 20 20 54 68 65 20 64 6f 4e 6f 74 53 70 69  d.  The doNotSpi
3620: 6c 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ll variable.**  
3630: 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61   inhibits all ca
3640: 63 68 65 20 73 70 69 6c 6c 20 61 6e 64 20 64 6f  che spill and do
3650: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 6e 68  NotSyncSpill inh
3660: 69 62 69 74 73 20 74 68 6f 73 65 20 73 70 69 6c  ibits those spil
3670: 6c 73 20 74 68 61 74 0a 2a 2a 20 20 20 77 6f 75  ls that.**   wou
3680: 6c 64 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ld require a jou
3690: 72 6e 61 6c 20 73 79 6e 63 2e 20 20 54 68 65 20  rnal sync.  The 
36a0: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69  doNotSyncSpill i
36b0: 73 20 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65  s set and cleare
36c0: 64 20 0a 2a 2a 20 20 20 62 79 20 73 71 6c 69 74  d .**   by sqlit
36d0: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
36e0: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
36f0: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
3700: 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67  c from happening
3710: 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65   .**   in betwee
3720: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
3730: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
3740: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
3750: 72 2e 20 20 54 68 65 0a 2a 2a 20 20 20 64 6f 4e  r.  The.**   doN
3760: 6f 74 53 70 69 6c 6c 20 76 61 6c 75 65 20 73 65  otSpill value se
3770: 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70 61 67  t to prevent pag
3780: 65 72 53 74 72 65 73 73 28 29 20 66 72 6f 6d 20  erStress() from 
3790: 74 72 79 69 6e 67 20 74 6f 20 75 73 65 0a 2a 2a  trying to use.**
37a0: 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64     the journal d
37b0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
37c0: 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63  ..**.** needSync
37d0: 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49  .**.**   TODO: I
37e0: 74 20 6d 69 67 68 74 20 62 65 20 65 61 73 69 65  t might be easie
37f0: 72 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61  r to set this va
3800: 72 69 61 62 6c 65 20 69 6e 20 77 72 69 74 65 4a  riable in writeJ
3810: 6f 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20  ournalHdr().**  
3820: 20 61 6e 64 20 77 72 69 74 65 4d 61 73 74 65 72   and writeMaster
3830: 4a 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20  Journal() only. 
3840: 43 68 61 6e 67 65 20 69 74 73 20 6d 65 61 6e 69  Change its meani
3850: 6e 67 20 74 6f 20 22 75 6e 73 79 6e 63 65 64 20  ng to "unsynced 
3860: 64 61 74 61 0a 2a 2a 20 20 20 68 61 73 20 62 65  data.**   has be
3870: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
3880: 65 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a  e journal"..**.*
3890: 2a 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a  * subjInMemory.*
38a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61  *.**   This is a
38b0: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
38c0: 65 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e  e. If true, then
38d0: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75   any required su
38e0: 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69  b-journal.**   i
38f0: 73 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69  s opened as an i
3900: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
3910: 20 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c   file. If false,
3920: 20 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a   then in-memory.
3930: 2a 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  **   sub-journal
3940: 73 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20  s are only used 
3950: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  for in-memory pa
3960: 67 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74  ger files..*/.st
3970: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73  ruct Pager {.  s
3980: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
3990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53  ;          /* OS
39a0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73   functions to us
39b0: 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38  e for IO */.  u8
39c0: 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20   exclusiveMode; 
39d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
39e0: 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f  lean. True if lo
39f0: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c  cking_mode==EXCL
3a00: 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f  USIVE */.  u8 jo
3a10: 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20  urnalMode;      
3a20: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20         /* On of 
3a30: 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  the PAGER_JOURNA
3a40: 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a  LMODE_* values *
3a50: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
3a60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3a70: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
3a80: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
3a90: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
3aa0: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
3ab0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
3ac0: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
3ad0: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
3ae0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b00: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3b10: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3b20: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3b30: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3b40: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3b50: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3b60: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3b70: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3b80: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3b90: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3ba0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3bb0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65  _FULL */.  u8 te
3bc0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
3bd0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
3be0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
3bf0: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
3c00: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
3c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3c20: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
3c30: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
3c40: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
3c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3c60: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
3c70: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
3c80: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
3c90: 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73  g block contains
3ca0: 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d   those class mem
3cb0: 62 65 72 73 20 74 68 61 74 20 61 72 65 20 64 79  bers that are dy
3cc0: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d  namically.  ** m
3cd0: 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e  odified during n
3ce0: 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73  ormal operations
3cf0: 2e 20 54 68 65 20 6f 74 68 65 72 20 76 61 72 69  . The other vari
3d00: 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74  ables in this st
3d10: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65  ructure.  ** are
3d20: 20 65 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74   either constant
3d30: 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   throughout the 
3d40: 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20  lifetime of the 
3d50: 70 61 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20  pager, or else. 
3d60: 20 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72   ** used to stor
3d70: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
3d80: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
3d90: 61 66 66 65 63 74 20 74 68 65 20 77 61 79 20 74  affect the way t
3da0: 68 65 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f  he pager .  ** o
3db0: 70 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20  perates..  **.  
3dc0: 2a 2a 20 54 68 65 20 27 73 74 61 74 65 27 20 76  ** The 'state' v
3dd0: 61 72 69 61 62 6c 65 20 69 73 20 64 65 73 63 72  ariable is descr
3de0: 69 62 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74  ibed in more det
3df0: 61 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ail along with t
3e00: 68 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  he.  ** descript
3e10: 69 6f 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75  ions of the valu
3e20: 65 73 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d  es it may take -
3e30: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74   PAGER_UNLOCK et
3e40: 63 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20  c. Many of the. 
3e50: 20 2a 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62   ** other variab
3e60: 6c 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63  les in this bloc
3e70: 6b 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  k are described 
3e80: 69 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64  in the comment d
3e90: 69 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62  irectly .  ** ab
3ea0: 6f 76 65 20 74 68 69 73 20 63 6c 61 73 73 20 64  ove this class d
3eb0: 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  efinition..  */.
3ec0: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
3ef0: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
3f00: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
3f10: 64 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20  dbModified;     
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3f30: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
3f40: 79 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  y changes to the
3f50: 20 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64   Db */.  u8 need
3f60: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
3f70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3f80: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
3f90: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
3fa0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  nal */.  u8 jour
3fb0: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
3fc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3fd0: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
3fe0: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
3ff0: 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   u8 changeCountD
4000: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  one;         /* 
4010: 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d  Set after increm
4020: 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  enting the chang
4030: 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  e-counter */.  u
4040: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
4050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4060: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
4070: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
4080: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
4090: 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20  8 doNotSpill;   
40a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
40b0: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
40c0: 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65  ache when non-ze
40d0: 72 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74  ro */.  u8 doNot
40e0: 53 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20  SyncSpill;      
40f0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f      /* Do not do
4100: 20 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65   a spill that re
4110: 71 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63  quires jrnl sync
4120: 20 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56   */.  u8 dbSizeV
4130: 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  alid;           
4140: 20 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62    /* Set when db
4150: 53 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20  Size is correct 
4160: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
4170: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
4180: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
4190: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
41a0: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f  urnals */.  Pgno
41b0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
41c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
41d0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
41e0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
41f0: 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b  Pgno dbOrigSize;
4200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
4210: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
4220: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
4230: 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  tion */.  Pgno d
4240: 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  bFileSize;      
4250: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4260: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4270: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
4280: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
42a0: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
42b0: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
42c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42e0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
42f0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
4300: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
4310: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
4320: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4330: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
4340: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
4350: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
4360: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
4370: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4380: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
4390: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
43a0: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
43b0: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
43c0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
43d0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
43e0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
43f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
4400: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4410: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
4420: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
4430: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
4440: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4450: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
4460: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
4470: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
4480: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
4490: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
44a0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
44b0: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
44c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
44d0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
44e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
44f0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
4500: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
4510: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
4520: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
4530: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
4540: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
4550: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
4560: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
4570: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
4580: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
4590: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
45a0: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
45b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
45c0: 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41  aSavepoint; /* A
45d0: 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73  rray of active s
45e0: 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69  avepoints */.  i
45f0: 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  nt nSavepoint;  
4600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4610: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
4620: 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d   in aSavepoint[]
4630: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
4640: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
4650: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
4660: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
4670: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ile changes */. 
4680: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
46a0: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
46b0: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
46c0: 61 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  ack */..  u16 nE
46d0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
46e0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
46f0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
4700: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
4710: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
4720: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
4730: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4740: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
4750: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
4760: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
4770: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
4780: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
4790: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
47a0: 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61  en() */.  int pa
47b0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
47c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
47d0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
47e0: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
47f0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
4800: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
4810: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
4820: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
4830: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
4840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4850: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
4860: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
4870: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
4880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4890: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
48a0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
48b0: 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
48c0: 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74  void*); /* Funct
48d0: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e  ion to call when
48e0: 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20   busy */.  void 
48f0: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
4900: 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78  ;      /* Contex
4910: 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78  t argument for x
4920: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23  BusyHandler */.#
4930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4940: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
4950: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
4960: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
4970: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
4980: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
4990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
49a0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
49b0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
49c0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65  dif.  void (*xRe
49d0: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
49e0: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
49f0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
4a00: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
4a10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
4a20: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
4a30: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
4a40: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
4a50: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
4a60: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
4a70: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
4a80: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
4a90: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
4aa0: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
4ab0: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
4ac0: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
4ad0: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
4ae0: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
4af0: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
4b00: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
4b10: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
4b20: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
4b30: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
4b40: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
4b50: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
4b60: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
4b70: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
4b80: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
4b90: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
4ba0: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
4bb0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
4bc0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
4bd0: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
4be0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61   */.  sqlite3_ba
4bf0: 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20  ckup *pBackup;  
4c00: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
4c10: 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20  list of ongoing 
4c20: 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
4c30: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
4c40: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
4c50: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
4c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
4c70: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
4c80: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
4c90: 64 65 3d 77 61 6c 22 20 2a 2f 0a 23 65 6e 64 69  de=wal" */.#endi
4ca0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f.};../*.** The 
4cb0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
4cc0: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
4cd0: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
4ce0: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
4cf0: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
4d00: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
4d10: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
4d20: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
4d30: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
4d40: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
4d50: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
4d60: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4d70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4d80: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
4d90: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
4da0: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
4db0: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
4dc0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4dd0: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
4de0: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
4df0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
4e00: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to DB */.
4e10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4e20: 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
4e30: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4e40: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
4e50: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
4e60: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
4e70: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
4e80: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
4e90: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
4ea0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
4eb0: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
4ec0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
4ed0: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
4ee0: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
4ef0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
4f00: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
4f10: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
4f20: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
4f30: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
4f40: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
4f50: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
4f60: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
4f70: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
4f80: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
4f90: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
4fa0: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
4fb0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a  urnal is being.*
4fc0: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
4fd0: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
4fe0: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
4ff0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
5000: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
5010: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
5020: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
5030: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
5040: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
5050: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
5060: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
5070: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
5080: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
5090: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
50a0: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
50b0: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
50c0: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
50d0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
50e0: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
50f0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
5100: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
5110: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
5120: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
5130: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
5140: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
5150: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
5160: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
5170: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
5180: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
5190: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
51a0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
51b0: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
51c0: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
51d0: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
51e0: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
51f0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
5200: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
5210: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
5220: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
5230: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
5240: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
5250: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
5260: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
5270: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
5280: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
5290: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
52a0: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
52b0: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
52c0: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
52d0: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
52e0: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
52f0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
5300: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
5310: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
5320: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
5330: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
5340: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
5350: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
5360: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
5370: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
5380: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
5390: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
53a0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
53b0: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
53c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
53d0: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
53e0: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
53f0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
5400: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
5410: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
5420: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
5430: 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  he of each page 
5440: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
5450: 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62  urnal is given b
5460: 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y.** the followi
5470: 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65  ng macro..*/.#de
5480: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
5490: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
54a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
54b0: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
54c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
54d0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
54e0: 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  er. This is usua
54f0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  lly the same .**
5500: 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c   size as a singl
5510: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
5520: 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f  ee also setSecto
5530: 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  rSize()..*/.#def
5540: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
5550: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
5560: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
5570: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
5580: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
5590: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
55a0: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
55b0: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
55c0: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
55d0: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
55e0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
55f0: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
5600: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
5610: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
5620: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
5630: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
5640: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
5650: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
5660: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
5670: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
5680: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
5690: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
56a0: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
56b0: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
56c0: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
56d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
56e0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
56f0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
5700: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
5710: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
5720: 34 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65  47483647..#ifnde
5730: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
5740: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
5750: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
5760: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
5770: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
5780: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
5790: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  state(Pager *pPa
57a0: 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65  ger){..  /* A te
57b0: 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79  mp-file is alway
57c0: 73 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55  s in PAGER_EXCLU
57d0: 53 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59  SIVE or PAGER_SY
57e0: 4e 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  NCED state. */. 
57f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
5800: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
5810: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
5820: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
5830: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e  ;..  /* The chan
5840: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
5850: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66   is always set f
5860: 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f  or temp-files */
5870: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5880: 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
5890: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
58a0: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
58b0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
58c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
58d0: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
58e0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
58f0: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
5900: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
5910: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
5920: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
5930: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
5940: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
5950: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
5960: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
5970: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
5980: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
5990: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
59a0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
59b0: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
59c0: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
59d0: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
59e0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
59f0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
5a00: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
5a10: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
5a20: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
5a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
5a40: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
5a50: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f  dr *pPg){.  Pgno
5a60: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
5a70: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
5a80: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
5a90: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
5aa0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e  (i=0; i<pPager->
5ab0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29  nSavepoint; i++)
5ac0: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
5ad0: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
5ae0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d  r->aSavepoint[i]
5af0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72  ;.    if( p->nOr
5b00: 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73  ig>=pgno && 0==s
5b10: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
5b20: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
5b30: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
5b40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
5b50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
5b60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5b70: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
5b80: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
5b90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5ba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5bb0: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67  pageInJournal(Pg
5bc0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
5bd0: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
5be0: 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65  cTest(pPg->pPage
5bf0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
5c00: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
5c10: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
5c20: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
5c30: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
5c40: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
5c50: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
5c60: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
5c70: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
5c80: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
5c90: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
5ca0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
5cb0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
5cc0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
5cd0: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
5ce0: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
5cf0: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
5d00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
5d10: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
5d20: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
5d30: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
5d40: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
5d50: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
5d60: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5d70: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
5d80: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
5d90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5da0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
5db0: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
5dc0: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
5dd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5de0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
5df0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
5e00: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
5e10: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
5e20: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
5e30: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
5e40: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
5e50: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
5e60: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
5e70: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
5e80: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
5e90: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
5ea0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
5eb0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
5ec0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
5ed0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5ee0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
5ef0: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
5f00: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
5f10: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
5f20: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
5f30: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
5f40: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
5f50: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
5f60: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
5f70: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  set);.}../*.** T
5f80: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
5f90: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
5fa0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
5fb0: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
5fc0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
5fd0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
5fe0: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
5ff0: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
6000: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
6010: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
6020: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
6030: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
6040: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
6050: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
6060: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
6070: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
6080: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
6090: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
60a0: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
60b0: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
60c0: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  ods)../*.** If f
60d0: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
60e0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
60f0: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
6100: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
6110: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
6120: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
6130: 63 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70  ck){.  if( !isOp
6140: 65 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72  en(pFd) ){.    r
6150: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6160: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
6170: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46  lite3OsUnlock(pF
6180: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a  d, eLock);.}../*
6190: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
61a0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
61b0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
61c0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
61d0: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
61e0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
61f0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
6200: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
6210: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
6220: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
6230: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
6240: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
6250: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
6260: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
6270: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
6280: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
6290: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
62a0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
62b0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
62c0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
62d0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
62e0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
62f0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
6300: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
6310: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
6320: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
6330: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
6340: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
6350: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
6360: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
6370: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
6380: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
6390: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
63a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
63b0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
63c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
63d0: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
63e0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
63f0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
6400: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
6410: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
6420: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
6430: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
6440: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
6450: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
6460: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
6470: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
6480: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
6490: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
64a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
64b0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
64c0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
64d0: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
6500: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
6510: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
6520: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
6530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
6540: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
6550: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6570: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
6580: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
6590: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
65a0: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
65b0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
65c0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
65d0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
65e0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
65f0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
6600: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
6610: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
6620: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
6630: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
6640: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
6650: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
6660: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
6670: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
6680: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
6690: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
66a0: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
66b0: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
66c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
66d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
66e0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
66f0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
6700: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
6710: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
6720: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
6730: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
6740: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
6750: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
6760: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
6770: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
6780: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
6790: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
67a0: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
67b0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
67c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
67d0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
67e0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
67f0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
6800: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
6810: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
6820: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
6830: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
6840: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
6850: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
6860: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
6870: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
6880: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
6890: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
68a0: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
68b0: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
68c0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
68d0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
68e0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
68f0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
6900: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
6910: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
6920: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
6930: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
6940: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
6950: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
6960: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
6970: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
6980: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
6990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
69a0: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
69b0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
69c0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
69d0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
69e0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
69f0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
6a00: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
6a10: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
6a20: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
6a30: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
6a40: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
6a50: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
6a60: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
6a70: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
6a80: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
6a90: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
6aa0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
6ab0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
6ac0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
6ad0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
6ae0: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
6af0: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
6b00: 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  er->errCode.    
6b10: 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73    || (pPg->flags
6b20: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
6b30: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
6b40: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
6b50: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
6b60: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
6b70: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
6b80: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
6b90: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
6ba0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
6bb0: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
6bc0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
6bd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
6be0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
6bf0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
6c00: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
6c10: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
6c20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
6c30: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
6c40: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
6c50: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
6c60: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
6c70: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
6c80: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
6c90: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
6ca0: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
6cb0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
6cc0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
6cd0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
6ce0: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
6cf0: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
6d00: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
6d10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6d20: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
6d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
6d40: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
6d50: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
6d60: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
6d70: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
6d80: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
6d90: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
6da0: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
6db0: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
6dc0: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
6dd0: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
6de0: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
6df0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6e00: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
6e10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
6e20: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
6e30: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
6e40: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
6e50: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
6e60: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
6e70: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
6e80: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
6e90: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
6ea0: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
6eb0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
6ec0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
6ed0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6ee0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
6ef0: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
6f00: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
6f10: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
6f20: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
6f30: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
6f40: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
6f50: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
6f60: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
6f70: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
6f80: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
6f90: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
6fa0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
6fb0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
6fc0: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
6fd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6fe0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
6ff0: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
7000: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
7010: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
7020: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
7030: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7040: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
7050: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
7060: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
7070: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
7080: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
7090: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
70a0: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
70b0: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
70c0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
70d0: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
70e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
70f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7100: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
7110: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
7120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
7130: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
7140: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7150: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
7180: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
7190: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
71a0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
71d0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
71e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
71f0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
7200: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
7210: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
7220: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
7230: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
7240: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
7250: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
7260: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
7270: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
7280: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
7290: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
72a0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
72b0: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
72c0: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
72d0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
72e0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
72f0: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
7300: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
7310: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
7320: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7330: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
7340: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
7350: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
7360: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
7370: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
7380: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
7390: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
73a0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
73b0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
73c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
73d0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
73e0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
73f0: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
7400: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
7410: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
7420: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
7430: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7440: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
7450: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
7460: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
7470: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
7480: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
7490: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
74a0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
74b0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
74c0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
74d0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
74e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
74f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7500: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
7510: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
7520: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
7530: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
7540: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
7550: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
7560: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
7570: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7580: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
7590: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
75a0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
75b0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
75c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
75d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
75e0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
75f0: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
7600: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
7610: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
7620: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
7630: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7640: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
7650: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
7660: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
7670: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
7680: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
7690: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
76a0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
76b0: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
76c0: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
76d0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
7700: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
7710: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
7720: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
7730: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
7740: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
7760: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
7790: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
77a0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
77b0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
77c0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
77d0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
77e0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
77f0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
7800: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
7810: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7820: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
7830: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
7840: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
7850: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
7860: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
7870: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7880: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
7890: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
78a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
78b0: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
78c0: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
78d0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
78e0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
78f0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
7900: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
7910: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7920: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
7930: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7940: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
7950: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
7960: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
7970: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
7980: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
7990: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
79a0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
79b0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
79c0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
79d0: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
79e0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
79f0: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
7a00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
7a10: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
7a20: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
7a30: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
7a40: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
7a50: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
7a60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
7a70: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
7a80: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
7a90: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
7aa0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
7ab0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
7ac0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
7ad0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
7ae0: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
7af0: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
7b00: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
7b10: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
7b20: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
7b30: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
7b40: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
7b50: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
7b60: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
7b70: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
7b80: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
7b90: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
7ba0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
7bb0: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
7bc0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
7bd0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
7be0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
7bf0: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
7c00: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
7c10: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
7c20: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
7c30: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
7c40: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
7c50: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
7c60: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
7c70: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
7c80: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
7c90: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
7ca0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
7cb0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
7cc0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
7cd0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
7ce0: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
7cf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d20: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7d30: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
7d40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
7d50: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
7d60: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
7d70: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
7d80: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
7d90: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7da0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
7db0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
7dc0: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
7dd0: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
7de0: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
7df0: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
7e00: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
7e10: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
7e20: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
7e30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7e40: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7e50: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
7e60: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
7e70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
7e80: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
7e90: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
7ea0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
7eb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
7ec0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
7ed0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
7ee0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7ef0: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
7f00: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
7f10: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
7f20: 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
7f30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
7f40: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
7f50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
7f60: 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65  ommitted but the
7f70: 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20   write lock .   
7f80: 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c   ** is still hel
7f90: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  d on the file. I
7fa0: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a  f there is a siz
7fb0: 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72  e limit configur
7fc0: 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74  ed for .    ** t
7fd0: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  he persistent jo
7fe0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f  urnal and the jo
7ff0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
8000: 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f  ntly consumes mo
8010: 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  re.    ** space 
8020: 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20  than that limit 
8030: 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e  allows for, trun
8040: 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
8050: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
8060: 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65    ** to sync the
8070: 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   file following 
8080: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
8090: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
80a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
80b0: 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  iLimit>0 ){.    
80c0: 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20    i64 sz;.      
80d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
80e0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
80f0: 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  fd, &sz);.      
8100: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8110: 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29  K && sz>iLimit )
8120: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
8130: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
8140: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c  (pPager->jfd, iL
8150: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
8160: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8170: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
8180: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8190: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
81a0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
81b0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
81c0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
81d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
81e0: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
81f0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
8200: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
8210: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
8220: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
8230: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
8240: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
8250: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
8260: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
8270: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
8280: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
8290: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
82a0: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
82b0: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
82c0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
82d0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
82e0: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
82f0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
8300: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
8310: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
8320: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
8330: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
8340: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
8350: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
8360: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
8370: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44  .** - 4 bytes: D
8380: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
8390: 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  e..** .** Follow
83a0: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
83b0: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
83c0: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
83d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
83e0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
83f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8400: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8410: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
8420: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
8430: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
8440: 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65  *zHeader = pPage
8450: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f  r->pTmpSpace;  /
8460: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63  * Temporary spac
8470: 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  e used to build 
8480: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
8490: 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  nHeader = pPager
84a0: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  ->pageSize;     
84b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
84c0: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
84d0: 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32  zHeader */.  u32
84e0: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61   /* Bytes of hea
8510: 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74  der sector writt
8520: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  en */.  int ii; 
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8550: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
8560: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
8570: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
8580: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
8590: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
85a0: 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48  en. */..  if( nH
85b0: 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44  eader>JOURNAL_HD
85c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
85d0: 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f      nHeader = JO
85e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
85f0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
8600: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
8610: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
8620: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77  nd any of them w
8630: 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a  ere created .  *
8640: 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74  * since the most
8650: 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20   recent journal 
8660: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
8670: 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a  en, update the .
8680: 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
8690: 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66  int.iHdrOffset f
86a0: 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ields now..  */.
86b0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
86c0: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
86d0: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t; ii++){.    if
86e0: 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  ( pPager->aSavep
86f0: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
8700: 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
8710: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
8720: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
8730: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
8740: 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
8750: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
8760: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
8770: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
8780: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
8790: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a  pPager);..  /* .
87a0: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
87b0: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
87c0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
87d0: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
87e0: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
87f0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
8800: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
8810: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
8820: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
8830: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
8840: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
8850: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
8860: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
8870: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
8880: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
8890: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
88a0: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
88b0: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
88c0: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
88d0: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
88e0: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
88f0: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
8900: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
8910: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
8920: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
8930: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
8940: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
8950: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
8960: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
8970: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
8980: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
8990: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
89a0: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
89b0: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
89c0: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
89d0: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
89e0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
89f0: 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
8a00: 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
8a10: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d  l.  ** file it m
8a20: 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20  ay contain some 
8a30: 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68  garbage data. Th
8a40: 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e  ere are two scen
8a50: 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65  arios.  ** where
8a60: 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62   this risk can b
8a70: 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a  e ignored:.  **.
8a80: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
8a90: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
8aa0: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72  -sync mode. Corr
8ab0: 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f  uption can follo
8ac0: 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77  w a.  **     pow
8ad0: 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68  er failure in th
8ae0: 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a  is case anyway..
8af0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
8b00: 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  en the SQLITE_IO
8b10: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
8b20: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
8b30: 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a  s guarantees.  *
8b40: 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61  *     that garba
8b50: 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72  ge data is never
8b60: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
8b70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
8b80: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
8b90: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
8ba0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
8bb0: 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  nc );.  if( (pPa
8bc0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20  ger->noSync) || 
8bd0: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
8be0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
8bf0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
8c00: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
8c10: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
8c20: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
8c30: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
8c40: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
8c50: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65  {.    memcpy(zHe
8c60: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
8c70: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
8c80: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
8c90: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
8ca0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
8cb0: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
8cc0: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
8cd0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65  {.    memset(zHe
8ce0: 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ader, 0, sizeof(
8cf0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
8d00: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
8d10: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
8d20: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
8d30: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
8d40: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
8d50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8d60: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
8d70: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
8d80: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
8d90: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8da0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
8db0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
8dc0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
8dd0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
8de0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8df0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8e00: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
8e10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
8e20: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
8e30: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
8e40: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
8e50: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
8e60: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
8e70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
8e80: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
8e90: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
8ea0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
8eb0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8ec0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8ed0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
8ee0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
8ef0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
8f00: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
8f10: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
8f20: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
8f30: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
8f40: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
8f50: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
8f60: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
8f70: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
8f80: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
8f90: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
8fa0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
8fb0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
8fc0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
8fd0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
8fe0: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
8ff0: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
9000: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9010: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
9020: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
9030: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9040: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
9050: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
9060: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
9070: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
9080: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
9090: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
90a0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
90b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
90c0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
90d0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
90e0: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
90f0: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
9100: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
9110: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
9120: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
9130: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
9140: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
9150: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
9160: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
9170: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
9180: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
9190: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
91a0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
91b0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
91c0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
91d0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
91e0: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
91f0: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
9200: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
9210: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
9220: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
9230: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
9240: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
9250: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
9260: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
9270: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
9280: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
9290: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
92a0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
92b0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
92c0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
92d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
92e0: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
92f0: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
9300: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
9310: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
9320: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
9330: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
9340: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
9350: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
9360: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
9370: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
9380: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
9390: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
93a0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
93b0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
93c0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
93d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
93e0: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
93f0: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
9400: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
9410: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
9420: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
9430: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
9440: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
9450: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
9460: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
9470: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
9480: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
9490: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
94a0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
94b0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
94c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
94d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
94e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
94f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9500: 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65  Off );.    pPage
9510: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
9520: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
9530: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9540: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
9550: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
9560: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
9570: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
9580: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
9590: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
95a0: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
95b0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
95c0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
95d0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
95e0: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
95f0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
9600: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
9610: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
9620: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
9630: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
9640: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
9650: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
9660: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
9670: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9680: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
9690: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
96a0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
96b0: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
96c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
96d0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
96e0: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
96f0: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
9700: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
9710: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
9720: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
9730: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
9740: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
9750: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
9760: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9770: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
9780: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9790: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
97a0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
97b0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
97c0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
97d0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
97e0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
97f0: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
9800: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
9810: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
9820: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
9830: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
9840: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
9850: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
9860: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
9870: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
9880: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
9890: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
98a0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
98b0: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
98c0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
98d0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
98e0: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
98f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
9900: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
9910: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
9920: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
9930: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
9940: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
9950: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9970: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
9980: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
9990: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
99a0: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
99b0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
99c0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
99d0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
99e0: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
99f0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
9a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9a10: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
9a20: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
9a30: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
9a40: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
9a50: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
9a60: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
9a90: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
9aa0: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
9ab0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
9ac0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
9ad0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
9ae0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
9af0: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
9b00: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
9b10: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
9b20: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
9b30: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
9b40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
9b50: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
9b60: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
9b70: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
9b80: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
9b90: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
9ba0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
9bb0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
9bc0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
9bd0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
9be0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
9bf0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9c00: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
9c10: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
9c20: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
9c30: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
9c40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9c50: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
9c60: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
9c70: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
9c80: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
9c90: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
9ca0: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
9cb0: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
9cc0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
9cd0: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
9ce0: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
9cf0: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
9d00: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
9d10: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
9d20: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
9d30: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
9d40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
9d50: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
9d60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9d70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
9d80: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
9d90: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
9da0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
9db0: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
9dc0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
9dd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
9de0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
9df0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
9e00: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
9e10: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
9e20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
9e30: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
9e40: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
9e50: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
9e60: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
9e70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
9e80: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
9e90: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
9ea0: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
9eb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
9ec0: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
9ed0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
9ee0: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
9ef0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
9f00: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
9f10: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
9f20: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
9f30: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
9f40: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
9f50: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
9f60: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9f70: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9f80: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9f90: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
9fa0: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
9fb0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9fc0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9fd0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9fe0: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
9ff0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
a000: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
a010: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a020: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
a030: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
a040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
a050: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
a060: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
a070: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
a080: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
a090: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
a0a0: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
a0b0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
a0c0: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
a0d0: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
a0e0: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
a0f0: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
a100: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
a110: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
a120: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
a130: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
a140: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
a150: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
a160: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
a170: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
a180: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
a190: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
a1a0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
a1b0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a1c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
a1d0: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
a1e0: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
a1f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
a200: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
a210: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
a220: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
a230: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
a240: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
a250: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
a260: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
a270: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
a280: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
a290: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
a2a0: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
a2b0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
a2c0: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
a2d0: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
a2e0: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
a2f0: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
a300: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
a310: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
a320: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
a330: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
a340: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
a350: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
a360: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
a370: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
a380: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
a390: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
a3a0: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
a3b0: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
a3c0: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
a3d0: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
a3e0: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
a3f0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
a400: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
a410: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
a420: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
a430: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
a440: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
a450: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
a460: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
a470: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
a480: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
a490: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
a4a0: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
a4b0: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
a4c0: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
a4d0: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
a4e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
a4f0: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
a500: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a510: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
a520: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
a530: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
a540: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
a550: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a560: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
a570: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
a580: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
a590: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
a5a0: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
a5b0: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
a5c0: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
a5d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67  .    */.    iPag
a5e0: 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69  eSize16 = (u16)i
a5f0: 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  PageSize;.    rc
a600: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
a610: 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
a620: 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c  r, &iPageSize16,
a630: 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
a640: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
a650: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
a660: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a670: 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28  | iPageSize16==(
a680: 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b  u16)iPageSize );
a690: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
a6a0: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
a6b0: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
a6c0: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
a6d0: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
a6e0: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
a6f0: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
a700: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
a710: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
a720: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
a730: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
a740: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
a750: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
a760: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
a770: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
a780: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
a790: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
a7a0: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
a7b0: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
a7c0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
a7d0: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
a7e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
a7f0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
a800: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
a810: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
a820: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
a830: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a840: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
a850: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
a860: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
a870: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a880: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
a890: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
a8a0: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
a8b0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a8c0: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
a8d0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
a8e0: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
a8f0: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
a900: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
a910: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a920: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
a930: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
a940: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
a950: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
a960: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
a970: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
a980: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
a990: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
a9a0: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
a9b0: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
a9c0: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
a9d0: 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
a9e0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
a9f0: 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
aa00: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
aa10: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
aa20: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
aa30: 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
aa40: 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
aa50: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
aa60: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
aa70: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
aa80: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
aa90: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
aaa0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
aab0: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
aac0: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
aad0: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
aae0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
aaf0: 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
ab00: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
ab10: 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
ab20: 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
ab30: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
ab40: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
ab50: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
ab60: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
ab70: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
ab80: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
ab90: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
aba0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
abb0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
abc0: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
abd0: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
abe0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac00: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
ac10: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
ac20: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
ac30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
ac40: 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
ac50: 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
ac60: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ac80: 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
ac90: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
aca0: 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
acb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
acc0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
acd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
ace0: 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
acf0: 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
ad10: 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
ad20: 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
ad30: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
ad40: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
ad50: 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  r.   || pPager->
ad60: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ad70: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
ad80: 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61  EMORY .   || pPa
ad90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
ada0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
adb0: 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20  ODE_OFF .  ){.  
adc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
add0: 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
ade0: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
adf0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
ae00: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
ae10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ae20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
ae30: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
ae40: 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
ae50: 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
ae60: 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
ae70: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
ae80: 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
ae90: 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
aea0: 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
aeb0: 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
aec0: 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
aed0: 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
aee0: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
aef0: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
af00: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
af10: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
af20: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
af30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
af40: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
af50: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
af60: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
af70: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
af80: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
af90: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
afa0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
afb0: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
afc0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
afd0: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
afe0: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
aff0: 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
b000: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b010: 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
b020: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b030: 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
b040: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
b050: 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
b060: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
b070: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
b080: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
b090: 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
b0a0: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
b0b0: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
b0c0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
b0d0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
b0e0: 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
b0f0: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
b100: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
b110: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
b120: 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
b130: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
b140: 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
b150: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
b160: 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
b170: 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
b180: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
b190: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
b1a0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
b1b0: 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
b1c0: 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
b1d0: 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
b1e0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
b1f0: 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
b200: 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b  c, 8, iHdrOff+4+
b210: 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
b220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
b230: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
b240: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
b250: 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50 61  aster+20);.  pPa
b260: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
b270: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
b280: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
b290: 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
b2a0: 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
b2b0: 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
b2c0: 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
b2d0: 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
b2e0: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
b2f0: 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
b300: 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
b310: 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
b320: 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
b330: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
b340: 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
b350: 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
b360: 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
b370: 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
b380: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
b390: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
b3a0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
b3b0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
b3c0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
b3d0: 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
b3e0: 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
b3f0: 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
b400: 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
b410: 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
b420: 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
b430: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
b440: 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
b450: 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
b460: 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53  e..  */ .  if( S
b470: 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
b480: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
b490: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
b4a0: 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26  jrnlSize)).   &&
b4b0: 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72   jrnlSize>pPager
b4c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29  ->journalOff.  )
b4d0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
b4e0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
b4f0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
b500: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
b510: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b520: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
b530: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
b540: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
b550: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65   page number. Re
b560: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
b570: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72  r to the page or
b580: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71   NULL if the req
b590: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
b5a0: 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  ot .** already i
b5b0: 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  n memory..*/.sta
b5c0: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
b5d0: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
b5e0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
b5f0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20  ){.  PgHdr *p;  
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b610: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
b620: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20   value */..  /* 
b630: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
b640: 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f  le for a call to
b650: 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77   PcacheFetch() w
b660: 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  ith createFlag==
b670: 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20  0 to.  ** fail, 
b680: 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74  since no attempt
b690: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e   to allocate dyn
b6a0: 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  amic memory will
b6b0: 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20   be made..  */. 
b6c0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63   (void)sqlite3Pc
b6d0: 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
b6e0: 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
b6f0: 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72   0, &p);.  retur
b700: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
b710: 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
b720: 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  s in error-state
b730: 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  , discard all in
b740: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20 49  -memory pages. I
b750: 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69  f.** the pager i
b760: 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  s in error-state
b770: 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c  , then this call
b780: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
b790: 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e  ** TODO: Why can
b7a0: 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74 68   we not reset th
b7b0: 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69 6e  e pager while in
b7c0: 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f   error state?.*/
b7d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b7e0: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
b7f0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 53  pPager){.  if( S
b800: 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72  QLITE_OK==pPager
b810: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b820: 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
b830: 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
b840: 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c 69  ackup);.    sqli
b850: 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
b860: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
b870: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
b880: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
b890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
b8a0: 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69  all structures i
b8b0: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
b8c0: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61  epoint[] array a
b8d0: 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50  nd set both.** P
b8e0: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
b8f0: 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70  and Pager.nSavep
b900: 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c  oint to zero. Cl
b910: 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ose the sub-jour
b920: 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  nal.** if it is 
b930: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
b940: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63  er is not in exc
b950: 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a  lusive mode..*/.
b960: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
b970: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
b980: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b990: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
b9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
b9b0: 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67  ator for looping
b9c0: 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61   through Pager.a
b9d0: 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66  Savepoint */.  f
b9e0: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
b9f0: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
ba00: 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ii++){.    sqlit
ba10: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
ba20: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
ba30: 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
ba40: 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  int);.  }.  if( 
ba50: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
ba60: 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65  veMode || sqlite
ba70: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
ba80: 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
ba90: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
baa0: 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  e(pPager->sjfd);
bab0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
bac0: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76  ree(pPager->aSav
bad0: 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65  epoint);.  pPage
bae0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
baf0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  0;.  pPager->nSa
bb00: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
bb10: 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d  Pager->nSubRec =
bb20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
bb30: 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20   the bit number 
bb40: 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65  pgno in the Page
bb50: 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
bb60: 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76  vepoint .** bitv
bb70: 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ecs of all open 
bb80: 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75  savepoints. Retu
bb90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
bba0: 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72  successful.** or
bbb0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
bbc0: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
bbd0: 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  e occurs..*/.sta
bbe0: 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76  tic int addToSav
bbf0: 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61  epointBitvecs(Pa
bc00: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
bc10: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69  o pgno){.  int i
bc20: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
bc30: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
bc40: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
bc50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
bc60: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
bc70: 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d  de */..  for(ii=
bc80: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
bc90: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
bca0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
bcb0: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
bcc0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
bcd0: 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  ;.    if( pgno<=
bce0: 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  p->nOrig ){.    
bcf0: 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42    rc |= sqlite3B
bd00: 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53  itvecSet(p->pInS
bd10: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b  avepoint, pgno);
bd20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bd30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
bd40: 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
bd50: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
bd60: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
bd70: 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20  OMEM );.    }.  
bd80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
bd90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
bda0: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
bdb0: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
bdc0: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
bdd0: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
bde0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
bdf0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
be00: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
be10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73  QLITE_OMIT_WAL.s
be20: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
be30: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
be40: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ger){.  return (
be50: 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29  pPager->pWal!=0)
be60: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
be70: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
be80: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
be90: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
bea0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
beb0: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
bec0: 2c 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e 65  ,y,z) 0.# define
bed0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
bee0: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
bef0: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
bf00: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
bf10: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
bf20: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
bf30: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
bf40: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
bf50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
bf60: 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
bf70: 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75  r.** is in exclu
bf80: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
bf90: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
bfa0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
bfb0: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
bfc0: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
bfd0: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
bfe0: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
bff0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
c000: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
c010: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
c020: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
c030: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
c040: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
c050: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
c060: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
c070: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
c080: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
c090: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
c0a0: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
c0b0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
c0c0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
c0d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c0e0: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
c0f0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
c100: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
c110: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
c120: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c130: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
c140: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20  turn code */.   
c150: 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65   int iDc = isOpe
c160: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71  n(pPager->fd)?sq
c170: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
c180: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
c190: 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20  ger->fd):0;..   
c1a0: 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61   /* If the opera
c1b0: 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70  ting system supp
c1c0: 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20  ort deletion of 
c1d0: 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e  open files, then
c1e0: 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68  .    ** close th
c1f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
c200: 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65  hen dropping the
c210: 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20   database lock. 
c220: 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
c230: 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  * another connec
c240: 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61  tion with journa
c250: 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69  l_mode=delete mi
c260: 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66  ght delete the f
c270: 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66  ile.    ** out f
c280: 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20  rom under us..  
c290: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
c2a0: 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
c2b0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35  ODE_MEMORY   & 5
c2c0: 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
c2d0: 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
c2e0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20  ALMODE_OFF      
c2f0: 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
c300: 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
c310: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
c320: 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
c330: 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
c340: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
c350: 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b  ETE   & 5)!=1 );
c360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
c370: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
c380: 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31  TRUNCATE & 5)==1
c390: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c3a0: 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
c3b0: 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29  DE_PERSIST  & 5)
c3c0: 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30  ==1 );.    if( 0
c3d0: 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f  ==(iDc & SQLITE_
c3e0: 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
c3f0: 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20  E_WHEN_OPEN).   
c400: 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d    || 1!=(pPager-
c410: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35  >journalMode & 5
c420: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
c430: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c440: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
c450: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  }..    sqlite3Bi
c460: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
c470: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
c480: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
c490: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
c4a0: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
c4b0: 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
c4c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
c4d0: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20  le is unlocked, 
c4e0: 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69  somebody else mi
c4f0: 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54  ght change it. T
c500: 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
c510: 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
c520: 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67  .dbSize etc. mig
c530: 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  ht become invali
c540: 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73  d if.    ** this
c550: 20 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65 20 63   happens.  One c
c560: 61 6e 20 61 72 67 75 65 20 74 68 61 74 20 74 68  an argue that th
c570: 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20  is doesn't need 
c580: 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20 20  to be cleared.  
c590: 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 63    ** until the c
c5a0: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 68  hange-counter ch
c5b0: 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61 67  eck fails in Pag
c5c0: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a  erSharedLock()..
c5d0: 20 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e 67 20      ** Clearing 
c5e0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61  the page size ca
c5f0: 63 68 65 20 68 65 72 65 20 69 73 20 62 65 69 6e  che here is bein
c600: 67 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 0a  g conservative..
c610: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
c620: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
c630: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   0;..    if( pag
c640: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c650: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c660: 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
c670: 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
c680: 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
c690: 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55 6e  .      rc = osUn
c6a0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
c6b0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d   NO_LOCK);.    }
c6c0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
c6d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
c6e0: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d  Code = rc;.    }
c6f0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
c700: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
c710: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66  ger))..    /* If
c720: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
c730: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
c740: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
c750: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
c760: 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  .    ** trusted.
c770: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
c780: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
c790: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
c7a0: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
c7b0: 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
c7c0: 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20  scarded and the 
c7d0: 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c  error code safel
c7e0: 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  y cleared..    *
c7f0: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
c800: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
c810: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c820: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c830: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
c840: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c850: 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
c860: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
c870: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
c880: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
c890: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
c8a0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
c8b0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50  R_UNLOCK;.    pP
c8c0: 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
c8d0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
c8e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c8f0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
c900: 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c  d when an IOERR,
c910: 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c   CORRUPT or FULL
c920: 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61   error.** may ha
c930: 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65  ve occurred. The
c940: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
c950: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c960: 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74  the pager .** st
c970: 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
c980: 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  ond the error-co
c990: 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
c9a0: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
c9b0: 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74  er .** API funct
c9c0: 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
c9d0: 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
c9e0: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
c9f0: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
ca00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
ca10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
ca20: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
ca30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
ca40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
ca50: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
ca60: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
ca70: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e  s persistent. Un
ca80: 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65  til the persiste
ca90: 6e 74 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61  nt error is clea
caa0: 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65  red,.** subseque
cab0: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
cac0: 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20  this Pager will 
cad0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
cae0: 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  rn the same .** 
caf0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
cb00: 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65  * A persistent e
cb10: 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74  rror indicates t
cb20: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
cb30: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
cb40: 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
cb50: 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
cb60: 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
cb70: 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
cb80: 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
cb90: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
cba0: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
cbb0: 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
cbc0: 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
cbd0: 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
cbe0: 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
cbf0: 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
cc00: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
cc10: 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
cc20: 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
cc30: 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
cc40: 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
cc50: 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
cc60: 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
cc70: 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
cc80: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
cc90: 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
cca0: 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
ccb0: 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
ccc0: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
ccd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
cce0: 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
ccf0: 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
cd00: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
cd10: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
cd20: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
cd30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
cd40: 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
cd50: 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
cd60: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
cd70: 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
cd80: 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
cd90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
cda0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
cdb0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  ode = rc;.  }.  
cdc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cdd0: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
cde0: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
cdf0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
ce00: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
ce10: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
ce20: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
ce30: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
ce40: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
ce50: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
ce60: 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
ce70: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
ce80: 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
ce90: 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
cea0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
ceb0: 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
cec0: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
ced0: 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
cee0: 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
cef0: 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
cf00: 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c  base file and cl
cf10: 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
cf20: 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61  ate. If this mea
cf30: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65  ns that.** there
cf40: 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
cf50: 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
cf60: 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
cf70: 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ext connection.*
cf80: 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  * to obtain a sh
cf90: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
cfa0: 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
cfb0: 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77  y be this one) w
cfc0: 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62  ill.** roll it b
cfd0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
cfe0: 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
cff0: 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
d000: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
d010: 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
d020: 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
d030: 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
d040: 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
d050: 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
d060: 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
d070: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
d080: 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63  rror state. Whic
d090: 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
d0a0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
d0b0: 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
d0c0: 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
d0d0: 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
d0e0: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
d0f0: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
d100: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d110: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
d120: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  ode==SQLITE_OK &
d130: 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
d140: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
d150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
d160: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
d170: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
d180: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
d190: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
d1a0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
d1b0: 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75  );.  }.  pager_u
d1c0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
d1d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d1e0: 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
d1f0: 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73  saction. A trans
d200: 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c  action is usuall
d210: 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65  y ended by .** e
d220: 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f  ither a COMMIT o
d230: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65  r a ROLLBACK ope
d240: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75  ration. This rou
d250: 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c  tine may be call
d260: 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c  ed .** after rol
d270: 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a  lback of a hot-j
d280: 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e  ournal, or if an
d290: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
d2a0: 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74  ile opening.** t
d2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d2c0: 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76  or writing the v
d2d0: 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  ery first journa
d2e0: 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a  l-header of a.**
d2f0: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
d300: 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  ction..** .** If
d310: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
d320: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72   PAGER_SHARED or
d330: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
d340: 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
d350: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d360: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
d370: 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54  p (returns SQLIT
d380: 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  E_OK)..**.** Oth
d390: 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
d3a0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
d3b0: 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
d3c0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
d3d0: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
d3e0: 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
d3f0: 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
d400: 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
d410: 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
d420: 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
d430: 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
d440: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
d450: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
d460: 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
d470: 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
d480: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
d490: 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
d4a0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
d4b0: 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
d4c0: 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
d4d0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
d4e0: 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
d4f0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
d500: 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
d510: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
d520: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
d530: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
d540: 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
d550: 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
d560: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
d570: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
d580: 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
d590: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
d5a0: 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
d5b0: 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
d5c0: 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
d5d0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
d5e0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
d5f0: 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
d600: 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
d610: 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
d620: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
d630: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
d640: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
d650: 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
d660: 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
d670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d680: 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
d690: 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
d6a0: 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
d6b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
d6c0: 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
d6d0: 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
d6e0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
d6f0: 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
d700: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
d710: 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
d720: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
d730: 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
d740: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
d750: 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
d760: 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
d770: 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
d780: 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
d790: 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
d7a0: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
d7b0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
d7c0: 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
d7d0: 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
d7e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
d7f0: 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
d800: 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
d810: 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
d820: 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
d830: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
d840: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
d850: 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
d860: 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
d870: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
d880: 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
d890: 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
d8a0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
d8b0: 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20  s finalized, if 
d8c0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
d8d0: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
d8e0: 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65  he.** pager move
d8f0: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
d900: 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77  D state (and dow
d910: 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b  ngrades the lock
d920: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
d930: 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69  ase file accordi
d940: 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ngly)..**.** If 
d950: 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
d960: 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
d970: 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e  e mode and is in
d980: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74   PAGER_SYNCED st
d990: 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73  ate,.** it moves
d9a0: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
d9b0: 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72  IVE. No locks ar
d9c0: 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65  e downgraded whe
d9d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20  n running in.** 
d9e0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
d9f0: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
da00: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
da10: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
da20: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
da30: 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
da40: 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
da50: 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
da60: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
da70: 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
da80: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
da90: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
daa0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
dab0: 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
dac0: 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
dad0: 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
dae0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
daf0: 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
db00: 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
db10: 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
db20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
db30: 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
db40: 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
db50: 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
db60: 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
db70: 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
db80: 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
db90: 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
dba0: 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
dbb0: 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
dbc0: 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
dbd0: 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
dbe0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
dbf0: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
dc00: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
dc10: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
dc20: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
dc30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
dc40: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
dc50: 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
dc60: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
dc70: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
dc80: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
dc90: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
dca0: 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
dcb0: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
dcc0: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  */..  if( pPager
dcd0: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
dce0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
dcf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dd00: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c    }.  releaseAll
dd10: 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
dd20: 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  r);..  assert( i
dd30: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
dd40: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
dd50: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
dd60: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
dd70: 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
dd80: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
dd90: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
dda0: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
ddb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ddc0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
ddd0: 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
dde0: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  l(pPager->jfd) )
ddf0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
de00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
de10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
de20: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
de30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
de40: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
de50: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
de60: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
de70: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
de80: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
de90: 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
dea0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
deb0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
dec0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ded0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dee0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
def0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
df00: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
df10: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
df20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
df30: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
df40: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
df50: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
df60: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
df70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
df80: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
df90: 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
dfa0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
dfb0: 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
dfc0: 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
dfd0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
dfe0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
dff0: 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
e000: 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
e010: 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ter);.      page
e020: 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
e030: 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  rc);.      pPage
e040: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
e050: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
e060: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
e070: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
e080: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
e090: 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63  anch may be exec
e0a0: 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e  uted with Pager.
e0b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
e0c0: 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ORY if.      ** 
e0d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61  a hot-journal wa
e0e0: 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61  s just rolled ba
e0f0: 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
e100: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
e110: 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c     ** file shoul
e120: 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  d be closed and 
e130: 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73  deleted. If this
e140: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
e150: 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  es to.      ** t
e160: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e170: 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20  , it will do so 
e180: 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  using an in-memo
e190: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  ry journal. .   
e1a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
e1b0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
e1c0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
e1d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
e1e0: 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
e1f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e200: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
e210: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
e220: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
e230: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e240: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e250: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
e260: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e270: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
e280: 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
e290: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
e2a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
e2b0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
e2c0: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
e2d0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e2e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
e2f0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
e300: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
e310: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
e320: 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
e330: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
e340: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
e350: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
e360: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
e370: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
e380: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
e390: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
e3a0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
e3b0: 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ec = 0;.  sqlite
e3c0: 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
e3d0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
e3e0: 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
e3f0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
e400: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
e410: 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e  3WalEndWriteTran
e420: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
e430: 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  pWal);.    asser
e440: 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
e450: 4b 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  K );.    pPager-
e460: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
e470: 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49  HARED;..    /* I
e480: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
e490: 20 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f   was in locking_
e4a0: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
e4b0: 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f  ode but is no lo
e4c0: 6e 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72 6f  nger,.    ** dro
e4d0: 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
e4e0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
e4f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
e500: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
e510: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
e520: 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
e530: 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
e540: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30  (pPager->pWal, 0
e550: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20 3d  ) ){.      rc2 =
e560: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
e570: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
e580: 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  K);.    }.  }els
e590: 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
e5a0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
e5b0: 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f      rc2 = osUnlo
e5c0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
e5d0: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
e5e0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
e5f0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
e600: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
e610: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
e620: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
e630: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
e640: 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70  _SYNCED ){.    p
e650: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
e660: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
e670: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
e680: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
e690: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
e6a0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
e6b0: 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a  bModified = 0;..
e6c0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68    /* TODO: Is th
e6d0: 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20  is optimal? Why 
e6e0: 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20 69  is the db size i
e6f0: 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65 20  nvalidated here 
e700: 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 64  .  ** when the d
e710: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
e720: 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f  not unlocked? */
e730: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  .  pPager->dbOri
e740: 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c  gSize = 0;.  sql
e750: 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61  ite3PcacheTrunca
e760: 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  te(pPager->pPCac
e770: 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  he, pPager->dbSi
e780: 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  ze);.  if( !MEMD
e790: 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
e7a0: 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
e7b0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
e7c0: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
e7d0: 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
e7e0: 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
e7f0: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
e800: 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
e810: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
e820: 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
e830: 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
e840: 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
e850: 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
e860: 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
e870: 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
e880: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
e890: 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
e8a0: 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
e8b0: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
e8c0: 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
e8d0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
e8e0: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
e8f0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
e900: 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
e910: 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
e920: 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
e930: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
e940: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
e950: 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
e960: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
e970: 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
e980: 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
e990: 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
e9a0: 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
e9b0: 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
e9c0: 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
e9d0: 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
e9e0: 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
e9f0: 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
ea00: 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
ea10: 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
ea20: 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
ea30: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
ea40: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
ea50: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
ea60: 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
ea70: 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
ea80: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
ea90: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
eaa0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
eab0: 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
eac0: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
ead0: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
eae0: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
eaf0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
eb00: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
eb10: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
eb20: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
eb30: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
eb40: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
eb50: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
eb60: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
eb70: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
eb80: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
eb90: 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
eba0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ebb0: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
ebc0: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
ebd0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ebe0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
ebf0: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
ec00: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
ec10: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
ec20: 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
ec30: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
ec40: 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
ec50: 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
ec60: 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
ec70: 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
ec80: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
ec90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
eca0: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
ecb0: 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  either the journ
ecc0: 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61  al file (if isMa
ecd0: 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a  inJrnl==1) or.**
ece0: 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
ecf0: 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e  urnal (if isMain
ed00: 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61  Jrnl==0) and pla
ed10: 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e  yback that page.
ed20: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67  .** The page beg
ed30: 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70  ins at offset *p
ed40: 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
ed50: 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73  file. The *pOffs
ed60: 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69  et.** value is i
ed70: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
ed80: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
ed90: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  t page in the jo
eda0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
edb0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67   isMainJrnl flag
edc0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73   is true if this
edd0: 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   is the main rol
ede0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
edf0: 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74  d.** false for t
ee00: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
ee10: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20  rnal.  The main 
ee20: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
ee30: 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75   uses.** checksu
ee40: 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
ee50: 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
ee60: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
ee70: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
ee80: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
ee90: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
eea0: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
eeb0: 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
eec0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
eed0: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
eee0: 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
eef0: 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
ef00: 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
ef10: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
ef20: 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
ef30: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
ef40: 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
ef50: 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
ef60: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
ef70: 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
ef80: 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
ef90: 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
efa0: 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
efb0: 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
efc0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
efd0: 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
efe0: 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
eff0: 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
f000: 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
f010: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
f020: 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
f030: 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
f040: 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
f050: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
f060: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
f070: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
f080: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
f090: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
f0a0: 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
f0b0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
f0c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
f0d0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
f0e0: 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
f0f0: 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
f100: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
f110: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
f120: 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
f130: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
f140: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
f150: 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
f160: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
f170: 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
f180: 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
f190: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
f1a0: 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
f1b0: 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
f1c0: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
f1d0: 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
f1e0: 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
f1f0: 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
f200: 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
f210: 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
f220: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
f230: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
f240: 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
f250: 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
f260: 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
f270: 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
f280: 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
f290: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
f2a0: 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
f2b0: 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
f2c0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
f2d0: 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
f2e0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
f2f0: 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
f300: 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
f310: 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
f320: 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
f330: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
f340: 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
f350: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
f360: 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
f370: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
f380: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
f390: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
f3a0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
f3b0: 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
f3c0: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
f3d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
f3e0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
f3f0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
f400: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
f410: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
f420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f430: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
f440: 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
f450: 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
f460: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
f470: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
f480: 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
f490: 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
f4a0: 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
f4b0: 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
f4c0: 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
f4d0: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
f4e0: 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
f4f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f500: 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
f510: 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
f520: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
f530: 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
f540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
f550: 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
f560: 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
f570: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
f580: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
f590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f5a0: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
f5b0: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
f5c0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
f5f0: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
f600: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
f610: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
f620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
f630: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
f640: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
f650: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
f660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f670: 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
f680: 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
f690: 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
f6a0: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
f6b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
f6c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
f6d0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
f6e0: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
f6f0: 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
f700: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
f710: 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
f720: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61  s synced */..  a
f730: 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
f740: 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
f750: 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
f760: 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
f770: 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
f780: 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
f790: 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
f7a0: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
f7b0: 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
f7c0: 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
f7d0: 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
f7e0: 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
f7f0: 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
f800: 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
f810: 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
f820: 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
f830: 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
f840: 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
f850: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
f860: 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
f870: 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
f880: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
f890: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
f8a0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
f8b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  */.  assert( pag
f8c0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
f8d0: 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a  ==0 || (!isMainJ
f8e0: 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74  rnl && isSavepnt
f8f0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ) );..  /* Read 
f900: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
f910: 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
f920: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
f930: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
f940: 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
f950: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
f960: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
f970: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f980: 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
f990: 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
f9a0: 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
f9b0: 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
f9c0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
f9d0: 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
f9e0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
f9f0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
fa00: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
fa10: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38  3OsRead(jfd, (u8
fa20: 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
fa30: 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
fa40: 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
fa50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
fa60: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
fa70: 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
fa80: 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
fa90: 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
faa0: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
fab0: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
fac0: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
fad0: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
fae0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
faf0: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
fb00: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
fb10: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
fb20: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
fb30: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
fb40: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
fb50: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
fb60: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
fb70: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
fb80: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
fb90: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
fba0: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
fbb0: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
fbc0: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
fbd0: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
fbe0: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
fbf0: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
fc00: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
fc10: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
fc20: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
fc30: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
fc40: 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
fc50: 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
fc60: 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
fc70: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
fc80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fc90: 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
fca0: 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
fcb0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
fcc0: 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
fcd0: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
fce0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
fcf0: 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
fd00: 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
fd10: 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61  m(pPager, (u8*)a
fd20: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
fd30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fd40: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
fd50: 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65    }..  if( pDone
fd60: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
fd70: 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
fd80: 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
fd90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
fda0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
fdb0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
fdc0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
fdd0: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
fde0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
fdf0: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
fe00: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
fe10: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
fe20: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
fe30: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
fe40: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
fe50: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
fe60: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
fe70: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
fe80: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
fe90: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
fea0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
feb0: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
fec0: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
fed0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
fee0: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
fef0: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
ff00: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
ff10: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
ff20: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
ff30: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
ff40: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
ff50: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
ff60: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
ff70: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
ff80: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
ff90: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
ffa0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
ffb0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
ffc0: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
ffd0: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
ffe0: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
fff0: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
10000 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
10010 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
10020 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
10030 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
10040 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
10050 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
10060 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
10070 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
10080 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
10090 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
100a0 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
100b0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
100c0 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
100d0 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
100e0 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
100f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
10100 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
10110 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
10120 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
10130 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
10140 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
10150 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
10160 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
10170 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
10180 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
10190 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
101a0 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
101b0 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
101c0 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
101d0 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
101e0 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
101f0 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
10200 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
10210 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
10220 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
10230 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
10240 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
10250 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
10260 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
10270 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
10280 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
10290 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
102a0 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
102b0 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
102c0 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
102d0 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
102e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
102f0 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
10300 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
10310 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
10320 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
10330 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
10340 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
10350 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
10360 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
10370 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
10380 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
10390 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
103a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
103b0 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
103c0 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
103d0 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
103e0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
103f0 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
10400 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
10410 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
10420 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
10430 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
10440 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
10450 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
10460 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
10470 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
10480 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
10490 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
104a0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
104b0 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
104c0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
104d0 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
104e0 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
104f0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
10500 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
10510 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
10520 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
10530 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
10540 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
10550 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  /.  if( pagerUse
10560 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
10570 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
10580 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  lse{.    pPg = p
10590 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
105a0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  er, pgno);.  }. 
105b0 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20   assert( pPg || 
105c0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45  !MEMDB );.  PAGE
105d0 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43  RTRACE(("PLAYBAC
105e0 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  K %d page %d has
105f0 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20  h(%08x) %s\n",. 
10600 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
10610 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
10620 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
10630 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10640 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20  , (u8*)aData),. 
10650 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69            (isMai
10660 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72  nJrnl?"main-jour
10670 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61  nal":"sub-journa
10680 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  l").  ));.  if( 
10690 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
106a0 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61    isSynced = pPa
106b0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28  ger->noSync || (
106c0 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67  *pOffset <= pPag
106d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
106e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
106f0 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30  Synced = (pPg==0
10700 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
10710 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f  gs & PGHDR_NEED_
10720 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66  SYNC));.  }.  if
10730 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
10740 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
10750 45 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28  E).   && isOpen(
10760 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26  pPager->fd).   &
10770 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
10780 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
10790 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
107a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
107b0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
107c0 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
107d0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
107e0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
107f0 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
10800 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
10810 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
10820 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
10830 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
10840 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
10850 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
10860 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
10870 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
10880 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
10890 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
108a0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
108b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
108c0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
108d0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
108e0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
108f0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
10900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
10910 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
10920 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
10930 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
10940 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
10950 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
10960 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
10970 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  MEM, aData);.   
10980 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
10990 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
109a0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
109b0 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
109c0 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
109d0 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
109e0 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
109f0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
10a00 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
10a10 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
10a20 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
10a30 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
10a40 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
10a50 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
10a60 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
10a70 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
10a80 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
10a90 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
10aa0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
10ab0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
10ac0 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
10ad0 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
10ae0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
10af0 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
10b00 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
10b10 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
10b20 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
10b30 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
10b40 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
10b50 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
10b60 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
10b70 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
10b80 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
10b90 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
10ba0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
10bb0 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
10bc0 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
10bd0 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
10be0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
10bf0 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
10c00 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
10c10 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
10c20 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
10c30 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
10c40 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
10c50 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
10c60 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
10c70 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
10c80 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
10c90 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
10ca0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
10cb0 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
10cc0 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
10cd0 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
10ce0 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
10cf0 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
10d00 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
10d10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
10d20 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
10d30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10d40 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b  doNotSpill==0 );
10d50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
10d60 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72  otSpill++;.    r
10d70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10d80 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
10d90 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a  pgno, &pPg, 1);.
10da0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10db0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d  er->doNotSpill==
10dc0 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
10dd0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20  >doNotSpill--;. 
10de0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10df0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
10e00 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
10e10 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
10e20 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
10e30 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
10e40 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
10e50 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
10e60 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
10e70 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
10e80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
10e90 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
10ea0 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
10eb0 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
10ec0 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
10ed0 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
10ee0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
10ef0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
10f00 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
10f10 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
10f20 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
10f30 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
10f40 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
10f50 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
10f60 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
10f70 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
10f80 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
10f90 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
10fa0 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
10fb0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
10fc0 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
10fd0 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
10fe0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
10ff0 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
11000 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
11010 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
11020 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
11030 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
11040 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
11050 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
11060 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
11070 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
11080 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
11090 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
110a0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
110b0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
110c0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
110d0 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
110e0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
110f0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
11100 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
11110 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
11120 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
11130 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
11140 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
11150 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
11160 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
11170 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
11180 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
11190 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
111a0 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
111b0 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
111c0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
111d0 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
111e0 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
111f0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
11200 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
11210 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
11220 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
11230 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
11240 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
11250 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
11260 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
11270 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
11280 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
11290 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
112a0 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
112b0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
112c0 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
112d0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
112e0 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
112f0 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
11300 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
11310 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
11320 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
11330 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
11340 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
11350 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
11360 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
11370 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
11380 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
11390 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
113a0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
113b0 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
113c0 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
113d0 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
113e0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
113f0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
11400 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
11410 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
11420 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
11430 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
11440 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
11450 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
11460 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
11470 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
11480 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
11490 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
114a0 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
114b0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
114c0 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
114d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
114e0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
114f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
11500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
11510 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
11520 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  g);.    }.#ifdef
11530 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
11540 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
11550 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
11560 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
11570 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  dif.    /* If th
11580 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
11590 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
115a0 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
115b0 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
115c0 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
115d0 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
115e0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
115f0 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
11600 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
11610 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
11620 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
11630 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
11640 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
11650 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
11660 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
11670 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
11680 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
11690 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
116a0 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
116b0 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
116c0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
116d0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
116e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
116f0 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
11700 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
11710 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11720 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
11730 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
11740 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
11750 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11760 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
11770 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
11780 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
11790 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
117a0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
117b0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
117c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
117d0 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
117e0 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
117f0 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
11800 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
11810 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
11820 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
11830 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
11840 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
11850 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
11860 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
11870 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11880 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
11890 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
118a0 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
118b0 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
118c0 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
118d0 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
118e0 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
118f0 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
11900 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
11910 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
11920 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
11930 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
11940 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
11950 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
11960 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
11970 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
11980 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
11990 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
119a0 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
119b0 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
119c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
119d0 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
119e0 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
119f0 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
11a00 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
11a10 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
11a20 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
11a30 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
11a40 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
11a50 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
11a60 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
11a70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11a80 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
11a90 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
11aa0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
11ab0 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
11ac0 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
11ad0 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
11ae0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
11af0 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
11b00 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
11b10 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
11b20 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
11b30 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
11b40 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
11b50 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
11b60 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
11b70 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
11b80 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
11b90 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
11ba0 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
11bb0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
11bc0 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
11bd0 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
11be0 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
11bf0 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
11c00 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
11c10 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
11c20 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
11c30 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
11c40 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
11c50 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
11c60 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
11c70 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
11c80 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
11c90 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
11ca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
11cb0 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
11cc0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
11cd0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
11ce0 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
11cf0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
11d00 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
11d10 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
11d20 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
11d30 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
11d40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
11d50 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
11d60 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
11d70 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
11d80 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
11d90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11da0 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
11db0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
11dc0 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
11dd0 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
11de0 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
11df0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
11e00 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11e10 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
11e20 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
11e30 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
11e40 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
11e50 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
11e60 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
11e70 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
11e80 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
11e90 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
11ea0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
11eb0 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
11ec0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
11ed0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
11ee0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11ef0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
11f00 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
11f10 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
11f20 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
11f30 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
11f40 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11f50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
11f60 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
11f70 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
11f80 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
11f90 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
11fa0 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
11fb0 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
11fc0 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
11fd0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
11fe0 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
11ff0 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
12000 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
12010 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
12020 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
12030 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
12040 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
12050 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
12060 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
12070 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
12080 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
12090 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
120a0 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
120b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
120c0 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
120d0 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
120e0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
120f0 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
12100 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
12110 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
12120 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
12130 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
12140 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
12150 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
12160 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
12170 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
12180 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
12190 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
121a0 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
121b0 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
121c0 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
121d0 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
121e0 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
121f0 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
12200 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
12210 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
12220 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12230 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
12240 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
12250 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
12260 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
12270 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
12280 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
12290 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
122a0 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
122b0 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
122c0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
122d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
122e0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
122f0 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
12300 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
12310 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
12320 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
12330 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
12340 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
12350 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
12360 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
12370 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
12380 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
12390 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
123a0 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
123b0 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
123c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
123d0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
123e0 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
123f0 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
12400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12410 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
12420 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
12430 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
12440 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
12450 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
12460 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
12470 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
12480 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
12490 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
124a0 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
124b0 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
124c0 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
124d0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
124e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
124f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
12500 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
12510 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
12520 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
12530 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
12540 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
12550 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
12560 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
12570 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
12580 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
12590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
125a0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
125b0 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
125c0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
125d0 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
125e0 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
125f0 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
12600 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
12610 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
12620 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
12630 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
12640 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12650 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
12660 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
12670 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
12680 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
12690 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
126a0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
126b0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
126c0 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
126d0 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
126e0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
126f0 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
12700 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12710 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
12720 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
12730 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
12740 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
12750 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
12760 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
12770 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
12780 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
12790 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
127a0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
127b0 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
127c0 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
127d0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
127e0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
127f0 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
12800 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
12810 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
12820 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
12830 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
12840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12850 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12860 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
12870 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
12880 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
12890 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
128a0 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
128b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
128c0 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
128d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
128e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
128f0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12900 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
12910 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
12920 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
12930 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
12940 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
12950 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
12960 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
12970 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
12980 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
12990 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
129a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
129b0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
129c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
129d0 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
129e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
129f0 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
12a00 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
12a10 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
12a20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
12a30 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
12a40 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
12a50 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
12a60 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
12a70 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
12a80 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
12a90 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
12aa0 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
12ab0 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
12ac0 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
12ad0 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
12ae0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12af0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
12b00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
12b10 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
12b20 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
12b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
12b40 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
12b50 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
12b60 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
12b70 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
12b80 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
12b90 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
12ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
12bb0 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
12bc0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
12bd0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
12be0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
12bf0 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
12c00 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  , or an exclusiv
12c10 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a  e lock is not.**
12c20 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
12c30 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
12c40 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
12c50 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
12c60 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74   is.** changed t
12c70 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
12c80 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
12c90 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66  eSize bytes). If
12ca0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20   the file.** on 
12cb0 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
12cc0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
12cd0 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
12ce0 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
12cf0 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
12d00 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
12d10 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
12d20 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
12d30 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
12d40 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
12d50 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
12d60 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
12d70 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
12d80 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
12d90 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
12da0 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
12db0 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
12dc0 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
12dd0 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
12de0 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
12df0 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
12e00 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
12e10 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
12e20 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
12e30 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
12e40 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
12e50 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
12e60 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
12e70 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
12e80 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
12e90 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
12ea0 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
12eb0 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
12ec0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
12ed0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
12ee0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12ef0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
12f00 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
12f10 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
12f20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12f30 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
12f40 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
12f50 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  E && isOpen(pPag
12f60 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69  er->fd) ){.    i
12f70 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
12f80 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20  newSize;.    /* 
12f90 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
12fa0 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
12fb0 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
12fc0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
12fd0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
12fe0 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
12ff0 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
13000 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
13010 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
13020 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
13030 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
13040 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
13050 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
13060 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
13070 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
13080 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
13090 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
130a0 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
130b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
130c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
130d0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
130e0 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
130f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13110 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
13120 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
13130 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
13140 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13150 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13160 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
13170 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
13180 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
13190 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
131a0 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
131b0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
131c0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
131d0 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
131e0 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
131f0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
13200 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
13210 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a  be used used .**
13220 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
13230 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
13240 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
13250 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
13260 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
13270 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
13280 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
13290 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
132a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
132b0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
132c0 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
132d0 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
132e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
132f0 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
13300 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
13310 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
13320 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
13330 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
13340 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
13350 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
13360 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
13370 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
13380 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
13390 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
133a0 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
133b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
133c0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
133d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
133e0 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
133f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
13400 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13410 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
13420 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
13430 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
13440 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
13450 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
13460 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
13470 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
13480 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
13490 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
134a0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
134b0 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
134c0 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
134d0 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
134e0 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
134f0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
13500 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
13510 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
13520 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
13530 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
13540 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
13550 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  <32 ){.    pPage
13560 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
13570 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  512;.  }.  if( p
13580 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
13590 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
135a0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
135b0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
135c0 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61  >=512 );.    pPa
135d0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
135e0 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
135f0 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
13600 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
13610 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
13620 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
13630 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
13640 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
13650 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
13660 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
13670 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
13680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
13690 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
136a0 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
136b0 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
136c0 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
136d0 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
136e0 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
136f0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
13700 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
13710 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
13720 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
13730 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
13740 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
13750 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
13760 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
13770 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
13780 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
13790 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
137a0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
137b0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
137c0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
137d0 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
137e0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
137f0 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
13800 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
13810 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
13820 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
13830 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
13840 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
13850 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
13860 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
13870 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
13880 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
13890 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
138a0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
138b0 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
138c0 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
138d0 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
138e0 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
138f0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
13900 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
13910 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
13920 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
13930 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
13940 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
13950 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
13960 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
13970 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
13980 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
13990 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
139a0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
139b0 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
139c0 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
139d0 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
139e0 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
139f0 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
13a00 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
13a10 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
13a20 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
13a30 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
13a40 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
13a50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
13a60 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
13a70 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
13a80 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
13a90 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
13aa0 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
13ab0 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
13ac0 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
13ad0 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
13ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
13af0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
13b00 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
13b10 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
13b20 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
13b30 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13b40 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
13b50 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
13b60 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
13b70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
13b80 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
13b90 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
13ba0 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
13bb0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
13bc0 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
13bd0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
13be0 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
13bf0 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
13c00 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
13c10 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
13c20 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
13c30 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
13c40 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
13c50 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
13c60 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
13c70 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
13c80 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
13c90 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
13ca0 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
13cb0 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
13cc0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
13cd0 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
13ce0 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
13cf0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
13d00 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
13d10 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
13d20 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
13d30 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
13d40 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
13d50 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
13d60 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
13d70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
13d80 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
13d90 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
13da0 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
13db0 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
13dc0 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
13dd0 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
13de0 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
13df0 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
13e00 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
13e10 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
13e20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
13e30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13e40 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
13e50 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
13e60 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
13e70 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
13e80 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
13e90 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
13ea0 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
13eb0 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
13ec0 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
13ed0 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
13ee0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
13ef0 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
13f00 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
13f10 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
13f20 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
13f30 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
13f40 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
13f50 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
13f60 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
13f70 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
13f80 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
13f90 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
13fa0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13fb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
13fc0 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
13fd0 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
13fe0 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
13ff0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
14000 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
14010 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
14020 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
14030 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
14040 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
14050 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
14060 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
14070 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
14080 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
14090 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
140a0 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
140b0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
140c0 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
140d0 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
140e0 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
140f0 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
14100 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
14110 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
14120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14130 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
14140 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
14150 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
14160 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
14170 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
14180 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
14190 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
141a0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
141b0 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
141c0 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
141d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
141e0 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
141f0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
14200 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14220 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
14230 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
14240 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
14250 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
14260 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
14270 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
14280 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
14290 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
142a0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
142b0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
142c0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
142d0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
142e0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
142f0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
14300 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
14310 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
14320 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
14330 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
14340 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
14350 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
14360 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
14370 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
14380 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
14390 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
143a0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
143b0 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
143c0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
143d0 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
143e0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
143f0 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
14400 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
14410 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
14420 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
14430 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
14440 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
14450 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
14460 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
14470 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
14480 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
14490 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
144a0 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
144b0 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
144c0 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
144d0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
144e0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
144f0 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
14500 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
14510 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
14520 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
14530 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
14540 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
14550 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
14560 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
14570 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
14580 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
14590 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
145a0 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
145b0 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
145c0 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
145d0 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
145e0 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
145f0 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
14600 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
14610 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
14620 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
14630 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
14640 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
14650 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
14660 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
14670 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
14680 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
14690 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
146a0 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
146b0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
146c0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
146d0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
146e0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
146f0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
14700 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
14710 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
14720 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
14730 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
14740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
14750 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
14760 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
14770 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
14780 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
14790 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
147a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
147b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
147c0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
147d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
147e0 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
147f0 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
14800 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
14810 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
14820 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
14830 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
14840 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
14850 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
14860 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
14870 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
14880 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
14890 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
148a0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
148b0 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
148c0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
148d0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
148e0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
148f0 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
14900 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
14910 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
14920 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
14930 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
14940 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
14950 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
14960 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
14970 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
14980 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
14990 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
149a0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
149b0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
149c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
149d0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
149e0 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
149f0 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
14a00 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
14a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
14a20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14a30 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
14a40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14a50 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
14a60 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
14a70 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
14a80 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
14a90 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
14aa0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
14ab0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
14ac0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
14ad0 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
14ae0 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
14af0 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
14b00 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
14b10 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
14b20 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
14b30 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
14b40 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
14b50 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
14b60 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
14b70 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
14b80 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
14b90 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
14ba0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
14bb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14bc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
14bd0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
14be0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
14bf0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
14c00 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
14c10 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
14c20 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
14c30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14c40 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
14c50 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
14c60 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
14c70 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
14c80 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
14c90 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
14ca0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
14cb0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
14cc0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
14cd0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
14ce0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
14cf0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
14d00 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
14d10 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
14d20 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
14d30 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
14d40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
14d50 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
14d60 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
14d70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
14d80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
14d90 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
14da0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
14db0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
14dc0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
14dd0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
14de0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
14df0 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
14e00 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
14e10 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
14e20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
14e30 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
14e40 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
14e50 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
14e60 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
14e70 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
14e80 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
14e90 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
14ea0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
14eb0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
14ec0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
14ed0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
14ee0 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
14ef0 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
14f00 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
14f10 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
14f20 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
14f30 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
14f40 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
14f50 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
14f60 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
14f70 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
14f80 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
14f90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14fa0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
14fb0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
14fc0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
14fd0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
14fe0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
14ff0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15000 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
15010 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
15020 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
15030 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
15040 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
15050 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
15060 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
15070 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
15080 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
15090 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
150a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
150b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
150c0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
150d0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
150e0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
150f0 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
15100 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15120 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
15130 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
15140 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
15150 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
15160 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
15170 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
15180 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
15190 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
151a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
151b0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
151c0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
151d0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
151e0 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
151f0 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
15200 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
15210 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
15220 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
15230 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
15240 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
15250 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
15260 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
15270 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
15280 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
15290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
152a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
152b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
152c0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
152d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
152e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
152f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15300 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
15310 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15320 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
15330 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
15340 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
15350 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
15360 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
15370 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
15380 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
15390 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
153a0 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
153b0 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
153c0 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
153d0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
153e0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
153f0 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
15400 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
15410 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
15420 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
15430 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
15440 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
15450 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
15460 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
15470 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
15480 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
15490 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
154a0 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
154b0 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
154c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
154d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
154e0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
154f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15500 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
15510 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
15520 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
15530 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
15540 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
15550 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
15560 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
15570 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
15580 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
15590 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
155a0 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
155b0 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
155c0 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
155d0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
155e0 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
155f0 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
15600 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
15610 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
15620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
15630 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
15640 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15650 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15660 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
15670 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
15680 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
15690 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
156a0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
156b0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
156c0 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
156d0 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
156e0 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
156f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
15700 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
15710 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
15720 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
15730 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
15740 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
15750 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
15760 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
15770 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
15780 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
15790 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ied..  */.  asse
157a0 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rt(.    pPager->
157b0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20  fd->pMethods==0 
157c0 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ||.    sqlite3Os
157d0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
157e0 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
157f0 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
15800 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ,0)>=SQLITE_OK. 
15810 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
15820 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61  s playback is ha
15830 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69  ppening automati
15840 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c  cally as a resul
15850 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20  t of an IO or . 
15860 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   ** malloc error
15870 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61   that occurred a
15880 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d  fter the change-
15890 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
158a0 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65  ted but .  ** be
158b0 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
158c0 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
158d0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  ed, then the cha
158e0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a  nge-counter .  *
158f0 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  * modification m
15900 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65  ay just have bee
15910 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74  n reverted. If t
15920 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65  his happens in e
15930 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d  xclusive .  ** m
15940 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ode, then subseq
15950 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  uent transaction
15960 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
15970 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
15980 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61  ll not.  ** upda
15990 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
159a0 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68  unter at all. Th
159b0 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63  is may lead to c
159c0 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ache inconsisten
159d0 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73  cy.  ** problems
159e0 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65   for other proce
159f0 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  sses at some poi
15a00 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
15a10 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20  . So, just.  ** 
15a20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73  in case this has
15a30 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72   happened, clear
15a40 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
15a50 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20  Done flag now.. 
15a60 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68   */.  pPager->ch
15a70 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
15a80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15a90 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
15aa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
15ab0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
15ac0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
15ad0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
15ae0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
15af0 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
15b00 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
15b10 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73  name+1);.    tes
15b20 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
15b30 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
15b40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15b50 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  && pPager->noSyn
15b60 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
15b70 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
15b80 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63  LUSIVE ){.    rc
15b90 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
15ba0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
15bb0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
15bc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
15bd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
15be0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
15bf0 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
15c00 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
15c10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15c20 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
15c30 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
15c40 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
15c50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
15c70 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
15c80 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
15c90 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
15ca0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
15cb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
15cc0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
15cd0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
15ce0 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
15cf0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
15d00 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
15d10 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
15d20 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
15d30 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
15d40 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
15d50 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
15d60 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
15d70 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
15d80 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
15d90 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
15da0 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
15db0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
15dc0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
15dd0 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
15de0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
15df0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
15e00 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
15e10 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
15e20 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
15e30 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
15e40 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
15e50 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
15e60 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
15e70 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
15e80 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
15e90 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
15ea0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
15eb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15ec0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
15ed0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
15ee0 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
15ef0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15f00 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
15f10 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
15f20 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
15f30 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
15f40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
15f50 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
15f60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15f70 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
15f80 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
15f90 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
15fa0 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
15fb0 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
15fc0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
15fd0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
15fe0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
15ff0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
16000 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
16010 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
16020 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
16030 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
16040 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
16050 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
16060 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
16070 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
16080 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
16090 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
160a0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
160b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
160c0 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
160d0 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
160e0 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
160f0 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
16100 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
16110 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
16120 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
16130 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61   */.  int isInWa
16140 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
16150 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61     /* True if pa
16160 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c  ge is in log fil
16170 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
16180 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
16190 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
161a0 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
161b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
161c0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
161d0 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d  R_SHARED && !MEM
161e0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
161f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
16200 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  d) );..  if( NEV
16210 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65  ER(!isOpen(pPage
16220 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61  r->fd)) ){.    a
16230 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
16240 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d  empFile );.    m
16250 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
16260 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
16270 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75  eSize);.    retu
16280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16290 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
162a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
162b0 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
162c0 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
162d0 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
162e0 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
162f0 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
16300 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
16310 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70  gno, &isInWal, p
16320 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  gsz, pPg->pData)
16330 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
16340 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73  SQLITE_OK && !is
16350 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34  InWal ){.    i64
16360 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f   iOffset = (pgno
16370 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
16380 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
16390 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
163a0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  d(pPager->fd, pP
163b0 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20  g->pData, pgsz, 
163c0 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66  iOffset);.    if
163d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
163e0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
163f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16400 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
16410 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ..  if( pgno==1 
16420 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  ){.    if( rc ){
16430 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
16440 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65   read is unsucce
16450 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64  ssful, set the d
16460 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73  bFileVers[] to s
16470 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a  omething.      *
16480 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65  * that will neve
16490 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c  r be a valid fil
164a0 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69  e version.  dbFi
164b0 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f  leVers[] is a co
164c0 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62  py.      ** of b
164d0 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74  ytes 24..39 of t
164e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79  he database.  By
164f0 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c  tes 28..31 shoul
16500 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20  d always be.    
16510 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65    ** zero or the
16520 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
16530 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42  abase in page. B
16540 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20  ytes 32..35 and 
16550 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20  35..39.      ** 
16560 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e  should be page n
16570 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65  umbers which are
16580 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66   never 0xfffffff
16590 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20  f.  So filling. 
165a0 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e       ** pPager->
165b0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74  dbFileVers[] wit
165c0 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73  h all 0xff bytes
165d0 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e   should suffice.
165e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
165f0 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70  ** For an encryp
16600 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  ted database, th
16610 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d  e situation is m
16620 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79  ore complex:  by
16630 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e  tes.      ** 24.
16640 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
16650 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f  ase are white no
16660 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72  ise.  But the pr
16670 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20  obability of.   
16680 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73     ** white nois
16690 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ing equaling 16 
166a0 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
166b0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
166c0 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
166d0 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
166e0 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
166f0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
16700 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
16710 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
16720 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
16730 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16740 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
16750 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
16760 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
16770 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
16780 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
16790 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
167a0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
167b0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
167c0 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
167d0 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
167e0 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c  gno, 3, rc = SQL
167f0 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50  ITE_NOMEM);..  P
16800 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
16810 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
16820 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
16830 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
16840 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
16850 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
16860 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
16870 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45   PAGERTRACE(("FE
16880 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
16890 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
168b0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
168c0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
168d0 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65  sh(pPg)));..  re
168e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
168f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16900 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
16910 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
16920 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
16930 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
16940 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
16950 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
16960 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
16970 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
16980 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
16990 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
169a0 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
169b0 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
169c0 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
169d0 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
169e0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
169f0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
16a00 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
16a10 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
16a20 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
16a30 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
16a40 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
16a50 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
16a60 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
16a70 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
16a80 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
16a90 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
16aa0 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
16ab0 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
16ac0 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
16ad0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
16ae0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
16af0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
16b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16b10 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
16b20 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
16b30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
16b40 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
16b50 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
16b60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
16b70 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
16b80 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
16b90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16ba0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
16bb0 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
16bc0 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
16bd0 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d  r *pPg;..  pPg =
16be0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
16bf0 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
16c00 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
16c10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
16c20 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
16c30 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
16c40 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
16c50 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
16c60 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
16c70 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
16c80 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
16c90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16ca0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
16cb0 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
16cc0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
16cd0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
16ce0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16cf0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
16d00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
16d10 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
16d20 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
16d30 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
16d40 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
16d50 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
16d60 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16d70 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
16d80 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
16d90 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
16da0 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
16db0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
16dc0 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
16dd0 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
16de0 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
16df0 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
16e00 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
16e10 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
16e20 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
16e30 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
16e40 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
16e50 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
16e60 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
16e70 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
16e80 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
16e90 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
16ea0 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
16eb0 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
16ec0 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
16ed0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
16ee0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
16ef0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
16f00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
16f10 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
16f20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
16f30 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
16f40 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
16f50 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16f60 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
16f70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
16f80 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16fa0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
16fb0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fd0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
16fe0 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
16ff0 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
17000 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
17010 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
17020 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
17030 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
17040 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
17050 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
17060 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
17070 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
17080 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
17090 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
170a0 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
170b0 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
170c0 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
170d0 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
170e0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
170f0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
17100 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
17110 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
17120 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
17130 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
17140 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
17150 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
17160 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
17170 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
17180 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
17190 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
171a0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
171b0 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
171c0 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
171d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
171e0 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
171f0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
17200 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
17210 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
17220 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
17230 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
17240 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
17250 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17260 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17270 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
17280 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
17290 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
172a0 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
172b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
172c0 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
172d0 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
172e0 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
172f0 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
17300 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
17310 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
17320 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
17330 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
17340 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
17350 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70  */ .static int p
17360 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20  agerWalFrames(. 
17370 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17390 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
173a0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
173b0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
173c0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
173d0 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a   frames to log *
173e0 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61  /.  Pgno nTrunca
173f0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
17400 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
17410 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20  size after this 
17420 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
17430 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20  isCommit,       
17440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17450 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
17460 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
17470 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20   sync_flags     
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17490 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
174a0 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29   OsSync() (or 0)
174b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
174e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
174f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
17500 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  al );.  rc = sql
17510 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50  ite3WalFrames(pP
17520 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20  ager->pWal, .   
17530 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
17540 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75  ize, pList, nTru
17550 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c  ncate, isCommit,
17560 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b   sync_flags.  );
17570 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17580 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
17590 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50  pBackup ){.    P
175a0 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
175b0 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
175c0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
175d0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
175e0 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
175f0 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
17600 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
17610 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17620 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17630 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
17640 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
17650 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
17660 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
17670 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
17680 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
17690 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
176a0 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
176b0 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
176c0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
176d0 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
176e0 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
176f0 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
17700 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
17710 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
17720 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
17730 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
17740 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
17750 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
17760 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
17770 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
17780 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
17790 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
177a0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
177c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
177d0 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
177e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
177f0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
17800 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
17810 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
17820 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
17830 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  r) );..  /* sqli
17840 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
17850 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
17860 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
17870 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
17880 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
17890 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
178a0 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
178b0 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
178c0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
178d0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
178e0 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
178f0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
17900 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
17910 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
17920 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
17930 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
17940 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
17950 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
17960 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
17970 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
17980 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
17990 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
179a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
179b0 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79  ){.    int dummy
179c0 3b 0a 20 20 20 20 69 66 28 20 63 68 61 6e 67 65  ;.    if( change
179d0 64 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  d ){.      pager
179e0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
179f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17a00 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
17a10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
17a20 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  alid==0 );.    }
17a30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17a40 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17a50 70 50 61 67 65 72 2c 20 26 64 75 6d 6d 79 29 3b  pPager, &dummy);
17a60 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
17a70 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
17a80 52 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  RED;..  return r
17a90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
17aa0 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  k if the *-wal f
17ab0 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70  ile that corresp
17ac0 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61  onds to the data
17ad0 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
17ae0 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 2e  Pager.** exists.
17af0 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   Assuming no err
17b00 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
17b10 70 45 78 69 73 74 73 20 74 6f 20 31 20 69 66 20  pExists to 1 if 
17b20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
17b30 0a 2a 2a 20 6f 72 20 30 20 6f 74 68 65 72 77 69  .** or 0 otherwi
17b40 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  se and return SQ
17b50 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
17b60 4f 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  O or OOM error o
17b70 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a  ccurs, return.**
17b80 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
17b90 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
17ba0 20 69 6e 74 20 70 61 67 65 72 48 61 73 57 41 4c   int pagerHasWAL
17bb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17bc0 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
17bd0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bf0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
17c00 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17c30 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  the WAL file */.
17c40 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
17c50 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
17c60 20 20 7a 57 61 6c 20 3d 20 73 71 6c 69 74 65 33    zWal = sqlite3
17c70 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 77 61 6c  _mprintf("%s-wal
17c80 22 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ", pPager->zFile
17c90 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 57  name);.  if( !zW
17ca0 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
17cb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
17cc0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
17cd0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
17ce0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 7a 57 61  Pager->pVfs, zWa
17cf0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
17d00 5f 45 58 49 53 54 53 2c 20 70 45 78 69 73 74 73  _EXISTS, pExists
17d10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
17d20 72 65 65 28 7a 57 61 6c 29 3b 0a 20 20 7d 0a 20  ree(zWal);.  }. 
17d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17d40 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
17d50 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
17d60 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
17d70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
17d80 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
17d90 2a 20 65 78 69 73 74 73 2e 20 49 66 20 69 74 20  * exists. If it 
17da0 64 6f 65 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  does, open the p
17db0 61 67 65 72 20 69 6e 20 57 41 4c 20 6d 6f 64 65  ager in WAL mode
17dc0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
17dd0 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  no error.** occu
17de0 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61  rs, make sure Pa
17df0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
17e00 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 50 41  is not set to PA
17e10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
17e20 57 41 4c 2e 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  WAL..** If an IO
17e30 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   or OOM error oc
17e40 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
17e50 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
17e60 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
17e70 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  WAL file is open
17e80 65 64 2c 20 61 6c 73 6f 20 6f 70 65 6e 20 61 20  ed, also open a 
17e90 73 6e 61 70 73 68 6f 74 20 28 72 65 61 64 20 74  snapshot (read t
17ea0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
17eb0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
17ec0 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
17ed0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
17ee0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
17ef0 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
17f00 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
17f10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
17f20 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
17f30 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
17f40 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 2c 20 74  ete .** a WAL, t
17f50 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
17f60 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
17f70 64 69 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 74  dition between t
17f80 68 65 20 78 41 63 63 65 73 73 28 29 20 0a 2a 2a  he xAccess() .**
17f90 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
17fa0 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
17fb0 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 6f  ecuted by some o
17fc0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
17fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
17fe0 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
17ff0 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
18000 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
18010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
18020 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
18030 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  le ){.    int is
18040 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
18050 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
18060 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73  if WAL file exis
18070 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  ts */.    rc = p
18080 61 67 65 72 48 61 73 57 41 4c 28 70 50 61 67 65  agerHasWAL(pPage
18090 72 2c 20 26 69 73 57 61 6c 29 3b 0a 20 20 20 20  r, &isWal);.    
180a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
180b0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
180c0 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
180d0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
180e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
180f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
18100 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
18110 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18130 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
18140 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
18150 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
18160 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18170 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
18180 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
18190 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
181a0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
181b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
181c0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
181d0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
181e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
181f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18200 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18210 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
18220 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
18230 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
18240 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
18250 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
18260 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
18270 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
18280 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
18290 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
182a0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
182b0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
182c0 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
182d0 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
182e0 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
182f0 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
18300 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
18310 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
18320 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
18330 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
18340 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
18350 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
18360 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
18370 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
18380 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
18390 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
183a0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
183b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
183c0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
183d0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
183e0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
183f0 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
18400 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
18410 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
18420 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
18430 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
18440 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
18450 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
18460 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
18470 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
18480 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
18490 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
184a0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
184b0 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
184c0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
184d0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
184e0 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
184f0 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
18500 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
18510 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
18520 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
18530 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
18540 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
18550 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
18560 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
18570 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
18580 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
18590 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
185a0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
185b0 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
185c0 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
185d0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
185e0 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
185f0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
18600 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
18610 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
18620 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
18630 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
18640 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
18650 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
18660 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
18670 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
18680 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
18690 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
186a0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
186b0 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
186c0 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
186d0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
186e0 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
186f0 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
18700 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
18710 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
18720 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
18730 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
18740 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
18750 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
18760 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
18770 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
18780 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
18790 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
187a0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
187b0 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
187c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
187d0 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
187e0 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
187f0 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
18800 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
18810 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
18820 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
18830 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
18840 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
18850 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
18860 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
18870 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
18880 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
18890 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
188a0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
188b0 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
188c0 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
188d0 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
188e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
188f0 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
18900 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
18910 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
18920 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
18930 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
18940 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
18950 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
18960 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
18970 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
18980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
18990 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
189a0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
189b0 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
189c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
189d0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
189e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
189f0 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
18a00 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
18a10 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
18a20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
18a30 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
18a40 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
18a50 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
18a60 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
18a70 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
18a80 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
18a90 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
18aa0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
18ab0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
18ac0 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
18ad0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
18ae0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
18af0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
18b00 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
18b10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18b20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18b30 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
18b40 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
18b50 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
18b60 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
18b70 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
18b80 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
18b90 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
18ba0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
18bb0 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
18bc0 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
18bd0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
18be0 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
18bf0 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
18c00 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
18c10 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
18c20 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
18c30 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
18c40 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
18c50 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
18c60 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
18c70 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
18c80 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
18c90 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
18ca0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
18cb0 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
18cc0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
18cd0 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
18ce0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
18cf0 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
18d00 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
18d10 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
18d20 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
18d30 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
18d40 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
18d50 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
18d60 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
18d70 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
18d80 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
18d90 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
18da0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
18db0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
18dc0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
18dd0 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
18de0 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
18df0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
18e00 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
18e10 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
18e20 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
18e30 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
18e40 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
18e50 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
18e60 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
18e70 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
18e80 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
18e90 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
18ea0 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
18eb0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
18ec0 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
18ed0 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
18ee0 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
18ef0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
18f00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
18f10 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
18f20 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
18f30 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
18f40 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
18f50 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
18f60 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
18f70 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
18f80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
18f90 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
18fa0 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
18fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18fc0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18fd0 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
18fe0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
18ff0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
19000 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
19010 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
19020 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
19030 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19040 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
19050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19060 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19070 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
19080 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
19090 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
190a0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
190b0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
190c0 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
190d0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
190e0 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
190f0 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
19100 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
19110 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
19120 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
19130 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
19140 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
19150 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
19160 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
19170 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
19180 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
19190 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
191a0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
191b0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
191c0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
191d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
191e0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
191f0 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
19200 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
19210 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
19220 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
19230 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
19240 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
19250 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
19260 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
19270 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
19280 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
19290 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
192a0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
192b0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
192c0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
192d0 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
192e0 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
192f0 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
19300 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
19310 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
19320 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
19330 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
19340 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
19350 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
19360 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
19370 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
19380 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
19390 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
193a0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
193b0 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
193c0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
193d0 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
193e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
193f0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
19400 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
19410 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
19420 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
19430 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
19440 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
19450 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
19460 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
19470 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
19480 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
19490 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
194a0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
194b0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
194c0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
194d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
194e0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
194f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
19500 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
19510 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
19520 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
19530 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
19540 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
19550 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
19560 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
19570 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
19580 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
19590 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
195a0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
195b0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
195c0 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
195d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
195e0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
195f0 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
19600 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19610 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
19620 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
19630 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
19640 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
19650 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
19660 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
19670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19680 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
19690 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
196a0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
196b0 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
196c0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
196d0 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
196e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
196f0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
19700 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
19710 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
19720 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
19730 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
19740 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
19750 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
19760 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
19770 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
19780 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19790 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
197a0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
197b0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
197c0 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
197d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
197e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
197f0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
19800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19810 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
19820 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
19830 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
19840 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
19850 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
19860 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
19870 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
19880 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
19890 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
198a0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
198b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
198c0 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
198d0 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
198e0 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
198f0 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
19900 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
19910 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
19920 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
19930 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
19940 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
19950 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
19960 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
19970 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
19980 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
19990 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
199a0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
199b0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
199c0 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
199d0 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
199e0 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
199f0 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
19a00 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
19a10 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
19a20 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
19a30 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
19a40 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
19a50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
19a60 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
19a70 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
19a80 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
19a90 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
19aa0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
19ab0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
19ac0 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
19ad0 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
19ae0 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
19af0 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
19b00 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
19b10 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
19b20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19b30 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
19b40 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
19b50 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
19b60 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
19b70 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
19b80 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
19b90 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
19ba0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
19bb0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
19bc0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
19bd0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
19be0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
19bf0 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
19c00 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
19c10 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
19c20 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
19c30 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
19c40 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
19c50 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
19c60 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
19c70 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
19c80 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
19c90 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
19ca0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19cb0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
19cc0 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
19cd0 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
19ce0 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
19cf0 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
19d00 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
19d10 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
19d20 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
19d30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
19d40 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
19d50 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
19d60 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
19d70 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
19d80 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
19d90 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
19da0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
19db0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
19dc0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
19dd0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19de0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
19df0 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
19e00 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
19e10 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
19e20 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
19e30 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20  t bFullFsync){. 
19e40 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
19e50 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
19e60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
19e70 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
19e80 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
19e90 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
19ea0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
19eb0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  0;.  pPager->syn
19ec0 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c  c_flags = (bFull
19ed0 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  Fsync?SQLITE_SYN
19ee0 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
19ef0 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
19f00 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
19f10 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
19f20 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
19f30 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
19f40 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
19f50 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
19f60 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
19f70 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
19f80 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
19f90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
19fa0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
19fb0 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
19fc0 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
19fd0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
19fe0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19ff0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
1a000 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
1a010 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
1a020 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
1a030 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
1a040 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
1a050 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
1a060 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
1a070 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1a080 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
1a090 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
1a0a0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
1a0b0 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
1a0c0 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
1a0d0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
1a0e0 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
1a0f0 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
1a100 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
1a110 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
1a120 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
1a130 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
1a140 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
1a150 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
1a160 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
1a170 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
1a180 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1a190 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
1a1a0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
1a1b0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
1a1c0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
1a1d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a1e0 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
1a1f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1a200 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
1a210 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
1a220 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
1a230 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
1a240 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
1a250 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
1a260 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
1a270 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
1a280 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
1a290 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1a2a0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
1a2b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a2d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
1a2e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1a2f0 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
1a300 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
1a310 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
1a320 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
1a330 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
1a340 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
1a350 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1a360 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1a370 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
1a380 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1a390 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
1a3a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a3b0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
1a3c0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1a3d0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
1a3e0 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
1a3f0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
1a400 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1a410 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
1a420 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a430 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1a440 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
1a450 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
1a460 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
1a470 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
1a480 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
1a490 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
1a4a0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
1a4b0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
1a4c0 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
1a4d0 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
1a4e0 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
1a4f0 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
1a500 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
1a510 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
1a520 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
1a530 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
1a540 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1a550 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
1a560 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
1a570 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
1a580 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
1a590 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
1a5a0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
1a5b0 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
1a5c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1a5d0 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
1a5e0 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
1a5f0 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
1a600 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
1a610 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
1a620 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
1a630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1a660 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
1a670 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
1a680 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
1a690 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
1a6a0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
1a6b0 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
1a6c0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
1a6d0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
1a6e0 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
1a6f0 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
1a700 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
1a710 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
1a720 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
1a730 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
1a740 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
1a750 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
1a760 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
1a770 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
1a780 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
1a790 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
1a7a0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
1a7b0 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
1a7c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
1a7d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
1a7e0 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
1a7f0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a810 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1a820 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
1a830 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
1a840 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
1a850 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
1a860 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
1a870 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
1a880 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
1a890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
1a8a0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
1a8b0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
1a8c0 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
1a8d0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
1a8e0 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
1a8f0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1a900 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
1a910 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
1a920 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
1a930 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
1a940 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
1a950 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
1a960 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
1a970 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
1a980 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
1a990 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
1a9a0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
1a9b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a9c0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
1a9d0 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
1a9e0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
1a9f0 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
1aa00 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
1aa10 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa30 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
1aa40 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
1aa50 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
1aa60 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
1aa70 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
1aa80 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
1aa90 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
1aaa0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
1aab0 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
1aac0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
1aad0 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
1aae0 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
1aaf0 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
1ab00 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
1ab10 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1ab20 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
1ab30 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
1ab40 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ab50 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
1ab60 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
1ab70 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
1ab80 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
1ab90 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
1aba0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
1abb0 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
1abc0 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  PT or SQLITE_FUL
1abd0 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
1abe0 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
1abf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1ac00 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
1ac10 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
1ac20 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
1ac30 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
1ac40 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
1ac50 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
1ac60 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
1ac70 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
1ac80 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
1ac90 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
1aca0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
1acb0 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
1acc0 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
1acd0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
1ace0 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
1acf0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1ad00 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
1ad10 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
1ad20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
1ad30 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
1ad40 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
1ad50 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
1ad60 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
1ad70 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
1ad80 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
1ad90 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
1ada0 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
1adb0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1adc0 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
1add0 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
1ade0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
1adf0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1ae00 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
1ae10 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
1ae20 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
1ae30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
1ae40 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
1ae50 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
1ae60 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
1ae70 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
1ae80 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
1ae90 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1aea0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
1aeb0 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
1aec0 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
1aed0 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
1aee0 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
1aef0 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
1af00 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
1af10 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
1af20 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
1af30 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
1af40 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
1af50 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
1af60 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
1af70 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
1af80 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
1af90 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
1afa0 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
1afb0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1afc0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1afd0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1afe0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1aff0 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65  , u16 *pPageSize
1b000 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
1b010 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
1b020 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
1b030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b040 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67  K ){.    u16 pag
1b050 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
1b060 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
1b070 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
1b080 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
1b090 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
1b0a0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
1b0b0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61   );.    if( (pPa
1b0c0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
1b0d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1b0e0 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  =0).     && sqli
1b0f0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
1b100 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1b110 65 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  e)==0 .     && p
1b120 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
1b130 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
1b140 65 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  eSize .    ){.  
1b150 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
1b160 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1b170 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
1b180 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
1b190 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !pNew ){.       
1b1a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1b1b0 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
1b1c0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1b1d0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1b1e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1b1f0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
1b200 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
1b210 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
1b220 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
1b230 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1b240 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
1b250 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b260 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
1b270 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1b280 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
1b290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b2a0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
1b2b0 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
1b2c0 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73  ze;.    if( nRes
1b2d0 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
1b2e0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
1b2f0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
1b300 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
1b310 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
1b320 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
1b330 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
1b340 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
1b350 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
1b360 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1b370 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1b380 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1b390 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
1b3a0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
1b3b0 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
1b3c0 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
1b3d0 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
1b3e0 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
1b3f0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
1b400 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
1b410 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
1b420 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
1b430 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
1b440 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
1b450 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
1b460 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
1b470 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
1b480 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
1b490 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
1b4a0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
1b4b0 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
1b4c0 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
1b4d0 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
1b4e0 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
1b4f0 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
1b500 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
1b510 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1b520 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1b530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1b540 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
1b550 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
1b560 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
1b570 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
1b580 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
1b590 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
1b5a0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1b5b0 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
1b5c0 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
1b5d0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
1b5e0 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
1b5f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1b600 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
1b610 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
1b620 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
1b630 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
1b640 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
1b650 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
1b660 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
1b670 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
1b680 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  age){.  int nPag
1b690 65 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  e;.  if( mxPage>
1b6a0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
1b6b0 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
1b6c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1b6d0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1b6e0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  _UNLOCK ){.    s
1b6f0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1b700 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1b710 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  age);.    assert
1b720 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
1b730 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 7d 0a 20  >=nPage );.  }. 
1b740 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1b750 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
1b760 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
1b770 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
1b780 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
1b790 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
1b7a0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
1b7b0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
1b7c0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
1b7d0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
1b7e0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
1b7f0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
1b800 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1b810 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
1b820 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
1b830 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
1b840 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
1b850 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
1b860 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
1b870 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
1b880 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
1b890 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1b8a0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1b8b0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
1b8c0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1b8d0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
1b8e0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
1b8f0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
1b900 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
1b910 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
1b920 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
1b930 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
1b940 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
1b950 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
1b960 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
1b970 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
1b980 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
1b990 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
1b9a0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
1b9b0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
1b9c0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
1b9d0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
1b9e0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
1b9f0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
1ba00 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1ba10 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
1ba20 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
1ba30 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1ba40 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
1ba50 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
1ba60 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
1ba70 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
1ba80 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
1ba90 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
1baa0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
1bab0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
1bac0 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
1bad0 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
1bae0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1baf0 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
1bb00 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1bb10 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
1bb20 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
1bb30 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
1bb40 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1bb50 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
1bb60 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
1bb70 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
1bb80 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
1bb90 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
1bba0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
1bbb0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
1bbc0 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
1bbd0 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
1bbe0 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
1bbf0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1bc00 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1bc10 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
1bc20 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
1bc30 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
1bc40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1bc50 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
1bc60 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
1bc70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1bc80 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
1bc90 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1bca0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
1bcb0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
1bcc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1bcd0 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
1bce0 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
1bcf0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1bd00 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1bd10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1bd20 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
1bd30 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
1bd40 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
1bd50 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
1bd60 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
1bd70 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
1bd80 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
1bd90 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
1bda0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
1bdb0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
1bdc0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
1bdd0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
1bde0 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66 20  (pPager) );.#if 
1bdf0 30 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  0.  if( pagerUse
1be00 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1be10 20 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d     int isInWal =
1be20 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
1be30 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67  ite3WalRead(pPag
1be40 65 72 2d 3e 70 57 61 6c 2c 20 31 2c 20 26 69 73  er->pWal, 1, &is
1be50 49 6e 57 61 6c 2c 20 4e 2c 20 70 44 65 73 74 29  InWal, N, pDest)
1be60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1be70 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 49 6e 57  LITE_OK || isInW
1be80 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  al ){.      retu
1be90 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1bea0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1beb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1bec0 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
1bed0 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
1bee0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
1bef0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1bf00 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1bf10 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
1bf20 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1bf30 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1bf40 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1bf50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bf60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1bf70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1bf80 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
1bf90 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1bfa0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bfb0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
1bfc0 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e  .** with pPager.
1bfd0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
1bfe0 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  is calculated as
1bff0 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e   (<db file size>
1c000 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a  /<page-size>)..*
1c010 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
1c020 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
1c030 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
1c040 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
1c050 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
1c060 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
1c070 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a   1 page file..**
1c080 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1c090 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61   is in error sta
1c0a0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
1c0b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1c0c0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72   then the.** err
1c0d0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
1c0e0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1c0f0 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74  and *pnPage left
1c100 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a   unchanged. Or,.
1c110 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ** if the file s
1c120 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20  ystem has to be 
1c130 71 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20  queried for the 
1c140 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1c150 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72   and.** the quer
1c160 79 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e  y attempt return
1c170 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74  s an IO error, t
1c180 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1c190 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
1c1a0 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1c1b0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
1c1c0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1c1d0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
1c1e0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
1c1f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
1c200 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a  eturned.** and *
1c210 70 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  pnPage is set to
1c220 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1c230 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1c240 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
1c250 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1c260 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1c270 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
1c280 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
1c290 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
1c2a0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1c2b0 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1c2c0 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
1c2d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1c2e0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53  s in the file. S
1c2f0 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61  tore this in nPa
1c300 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ge. */.  if( pPa
1c310 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1c320 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
1c330 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1c340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c350 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c360 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65       /* Error re
1c370 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65  turned by OsFile
1c380 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36  Size() */.    i6
1c390 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
1c3a0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69        /* File si
1c3b0 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75  ze in bytes retu
1c3c0 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69  rned by OsFileSi
1c3d0 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ze() */..    if(
1c3e0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1c3f0 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
1c400 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1c410 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  OCK ){.      sql
1c420 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
1c430 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 6e 50 61  ager->pWal, &nPa
1c440 67 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ge);.    }..    
1c450 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1c460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
1c470 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1c480 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1c490 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 69 66  File );.      if
1c4a0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1c4b0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >fd) ){.        
1c4c0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
1c4d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1c4e0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1c4f0 64 2c 20 26 6e 29 29 20 29 7b 0a 20 20 20 20 20  d, &n)) ){.     
1c500 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
1c510 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1c520 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c530 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1c540 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
1c550 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
1c560 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1c570 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
1c580 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c590 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1c5a0 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70  o)(n / pPager->p
1c5b0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1c5c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1c5d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1c5e0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1c5f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c600 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
1c610 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1c620 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1c630 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c640 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  izeValid = 1;.  
1c650 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1c660 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
1c670 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1c680 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
1c690 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ter than the .  
1c6a0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1c6b0 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1c6c0 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1c6d0 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1c6e0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1c6f0 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1c700 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1c710 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1c720 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1c730 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1c740 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPage;.  }..  /*
1c750 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
1c760 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74  variable and ret
1c770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f  urn SQLITE_OK */
1c780 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1c790 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1c7a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1c7b0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
1c7c0 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
1c7d0 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
1c7e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1c7f0 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
1c800 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
1c810 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
1c820 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c830 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
1c840 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
1c850 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
1c860 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
1c870 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
1c880 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
1c890 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
1c8a0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
1c8b0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
1c8c0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
1c8d0 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
1c8e0 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
1c8f0 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
1c900 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
1c910 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
1c920 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
1c930 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
1c940 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
1c950 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1c960 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
1c970 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1c980 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
1c990 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
1c9a0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
1c9b0 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
1c9c0 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
1c9d0 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
1c9e0 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
1c9f0 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
1ca00 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1ca10 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
1ca20 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
1ca30 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
1ca40 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
1ca80 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
1ca90 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1caa0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1cab0 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
1cac0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
1cad0 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
1cae0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
1caf0 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
1cb00 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
1cb10 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1cb20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1cb30 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1cb40 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1cb50 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
1cb60 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
1cb70 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
1cb80 65 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20  e unknown. It.  
1cb90 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65  ** must not have
1cba0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
1cbb0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
1cbc0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1cbd0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1cbe0 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
1cbf0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
1cc00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1cc10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1cc20 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
1cc30 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
1cc40 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  d==0 );..  /* Ch
1cc50 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
1cc60 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
1cc70 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
1cc80 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
1cc90 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
1cca0 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
1ccb0 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
1ccc0 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
1ccd0 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
1cce0 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
1ccf0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1cd00 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
1cd10 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
1cd20 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
1cd30 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1cd40 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
1cd50 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
1cd60 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
1cd70 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1cd80 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  K && locktype==P
1cd90 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
1cda0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
1cdb0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
1cdc0 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70  ERVED && locktyp
1cdd0 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e==PAGER_EXCLUSI
1cde0 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  VE).  );..  if( 
1cdf0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
1ce00 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
1ce10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ce20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
1ce30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ce40 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
1ce50 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
1ce60 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
1ce70 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1ce80 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
1ce90 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
1cea0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
1ceb0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1cec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ced0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1cee0 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
1cef0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
1cf00 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
1cf10 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
1cf20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1cf30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cf40 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
1cf50 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
1cf60 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
1cf70 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1cf80 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
1cf90 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
1cfa0 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
1cfb0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
1cfc0 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
1cfd0 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
1cfe0 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
1cff0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1d000 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
1d010 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
1d020 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
1d030 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
1d040 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
1d050 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
1d060 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
1d070 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
1d080 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
1d090 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
1d0a0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
1d0b0 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
1d0c0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
1d0d0 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
1d0e0 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
1d0f0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
1d100 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1d110 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
1d120 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1d130 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
1d140 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
1d150 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
1d160 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
1d170 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
1d180 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
1d190 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
1d1a0 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
1d1b0 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
1d1c0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
1d1d0 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
1d1e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1d1f0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
1d200 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
1d210 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
1d220 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
1d230 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
1d240 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65  haviour would be
1d250 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
1d260 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
1d270 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
1d280 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
1d290 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
1d2a0 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
1d2b0 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
1d2c0 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
1d2d0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
1d2e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1d2f0 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
1d300 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
1d310 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
1d320 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
1d330 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
1d340 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
1d350 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
1d360 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
1d370 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
1d380 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
1d390 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
1d3a0 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
1d3b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1d3c0 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
1d3d0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d3e0 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
1d3f0 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
1d400 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d410 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
1d420 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
1d430 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
1d440 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
1d450 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
1d460 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
1d470 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d480 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
1d490 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
1d4a0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
1d4b0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
1d4c0 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
1d4d0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
1d4e0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1d4f0 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
1d500 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
1d510 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
1d520 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
1d530 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1d540 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
1d550 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
1d560 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
1d570 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
1d580 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
1d590 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
1d5a0 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
1d5b0 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
1d5c0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
1d5d0 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
1d5e0 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
1d5f0 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
1d600 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
1d610 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1d620 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  is committed..*/
1d630 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1d640 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1d650 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1d660 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
1d670 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1d680 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61  SizeValid );.  a
1d690 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1d6a0 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
1d6b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d6c0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1d6d0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61  ESERVED );.  pPa
1d6e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
1d6f0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75  age;.  assertTru
1d700 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
1d710 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pPager);.}.../*.
1d720 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d730 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
1d740 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
1d750 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1d760 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
1d770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d780 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
1d790 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
1d7a0 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
1d7b0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
1d7c0 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
1d7d0 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
1d7e0 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
1d7f0 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
1d800 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
1d810 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
1d820 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
1d830 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
1d840 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
1d850 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
1d860 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
1d870 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
1d880 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
1d890 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
1d8a0 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
1d8b0 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
1d8c0 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
1d8d0 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
1d8e0 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
1d8f0 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
1d900 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
1d910 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
1d920 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1d930 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
1d940 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
1d950 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1d960 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
1d970 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
1d980 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1d990 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
1d9a0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1d9b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1d9c0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
1d9d0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1d9e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d9f0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1da00 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
1da10 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
1da20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1da30 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1da40 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1da50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
1da60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1da70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1da80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
1da90 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
1daa0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
1dab0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
1dac0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
1dad0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
1dae0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
1daf0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
1db00 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1db10 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
1db20 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1db30 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
1db40 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
1db50 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
1db60 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
1db70 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
1db80 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
1db90 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
1dba0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
1dbb0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
1dbc0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1dbd0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
1dbe0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
1dbf0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
1dc00 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
1dc10 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
1dc20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1dc30 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
1dc40 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
1dc50 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
1dc60 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1dc70 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
1dc80 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
1dc90 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
1dca0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
1dcb0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
1dcc0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
1dcd0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
1dce0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1dcf0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
1dd00 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a  *pPager){.  u8 *
1dd10 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61  pTmp = (u8 *)pPa
1dd20 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1dd30 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
1dd40 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
1dd50 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
1dd60 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
1dd70 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1dd80 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
1dd90 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
1dda0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
1ddb0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
1ddc0 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
1ddd0 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20  ager->pWal,.    
1dde0 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  (pPager->noSync 
1ddf0 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79  ? 0 : pPager->sy
1de00 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20  nc_flags), .    
1de10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1de20 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50  , pTmp.  );.  pP
1de30 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
1de40 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
1de50 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1de60 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1de70 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1de80 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
1de90 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
1dea0 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
1deb0 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
1dec0 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
1ded0 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
1dee0 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
1def0 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
1df00 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
1df10 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
1df20 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
1df30 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
1df40 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
1df50 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
1df60 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
1df70 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
1df80 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
1df90 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
1dfa0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
1dfb0 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
1dfc0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
1dfd0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
1dfe0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
1dff0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e000 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1e010 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  fd) ){.      pPa
1e020 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70  ger->errCode = p
1e030 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
1e040 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1e050 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
1e060 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
1e070 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
1e080 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1e090 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
1e0a0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1e0b0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
1e0c0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
1e0d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1e0e0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
1e0f0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
1e100 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
1e110 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1e120 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
1e130 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
1e140 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
1e150 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
1e160 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
1e170 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1e180 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
1e190 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
1e1a0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
1e1b0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
1e1c0 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
1e1d0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
1e1e0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
1e1f0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
1e200 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
1e210 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
1e220 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
1e230 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
1e240 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1e250 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
1e260 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
1e270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e280 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
1e290 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
1e2a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1e2b0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
1e2c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1e2d0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
1e2e0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
1e2f0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
1e300 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1e310 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
1e320 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1e330 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
1e340 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
1e350 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
1e360 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1e370 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
1e380 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
1e390 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
1e3a0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
1e3b0 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
1e3c0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
1e3d0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
1e3e0 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
1e3f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1e400 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
1e410 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
1e420 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
1e430 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
1e440 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
1e450 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
1e460 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1e470 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1e480 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
1e490 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c  flag is not set,
1e4a0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
1e4b0 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f  ion is a.** no-o
1e4c0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
1e4d0 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
1e4e0 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
1e4f0 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a   journal-mode.**
1e500 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20   and the device 
1e510 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e520 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d  of the the file-
1e530 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
1e540 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
1e550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1e560 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
1e570 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
1e580 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
1e590 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
1e5a0 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
1e5b0 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
1e5c0 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
1e5d0 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
1e5e0 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
1e5f0 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
1e600 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
1e610 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
1e620 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
1e630 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
1e640 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
1e650 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1e660 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
1e670 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
1e680 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
1e690 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
1e6a0 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
1e6b0 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
1e6c0 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
1e6d0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1e6e0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
1e6f0 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
1e700 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
1e710 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
1e720 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
1e730 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
1e740 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
1e750 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
1e760 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
1e770 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
1e780 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
1e790 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
1e7a0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
1e7b0 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
1e7c0 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
1e7d0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
1e7e0 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
1e7f0 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
1e800 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
1e810 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
1e820 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
1e830 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
1e840 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
1e850 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
1e860 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
1e870 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64  * The Pager.need
1e880 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76  Sync flag is nev
1e890 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65  er be set for te
1e8a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f  mporary files, o
1e8b0 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70  r any.** file op
1e8c0 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  erating in no-sy
1e8d0 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e  nc mode (Pager.n
1e8e0 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e  oSync set to non
1e8f0 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  -zero)..**.** If
1e900 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
1e910 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
1e920 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
1e930 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
1e940 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
1e950 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
1e960 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
1e970 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
1e980 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
1e990 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1e9a0 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
1e9b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1e9c0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1e9d0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
1e9e0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
1e9f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ea00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
1ea10 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  dSync ){.    ass
1ea20 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
1ea30 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1ea40 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1ea50 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
1ea60 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
1ea70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eaa0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1eab0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
1eac0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
1ead0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1eae0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1eaf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1eb00 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1eb10 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
1eb20 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
1eb30 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1eb40 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
1eb50 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
1eb60 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
1eb70 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
1eb80 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
1eb90 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
1eba0 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
1ebb0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
1ebc0 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
1ebd0 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
1ebe0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
1ebf0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1ec00 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
1ec10 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
1ec20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
1ec30 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
1ec40 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
1ec50 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
1ec60 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
1ec70 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
1ec80 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
1ec90 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
1eca0 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
1ecb0 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
1ecc0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
1ecd0 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
1ece0 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
1ecf0 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
1ed00 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
1ed10 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
1ed20 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
1ed30 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
1ed40 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
1ed50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
1ed60 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
1ed70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1ed80 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
1ed90 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
1eda0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1edb0 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
1edc0 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
1edd0 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
1ede0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
1edf0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1ee00 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
1ee10 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
1ee20 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
1ee30 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
1ee40 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
1ee50 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
1ee60 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
1ee70 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
1ee80 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
1ee90 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1eea0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
1eeb0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1eec0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1eed0 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1eee0 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
1eef0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
1ef00 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
1ef10 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
1ef20 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
1ef30 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
1ef40 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
1ef50 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
1ef60 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
1ef70 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
1ef80 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
1ef90 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
1efa0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1efb0 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
1efc0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
1efd0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
1efe0 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
1eff0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
1f000 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
1f010 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
1f020 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
1f030 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
1f040 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
1f050 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
1f060 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
1f070 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
1f080 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
1f090 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
1f0a0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1f0b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
1f0c0 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
1f0d0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
1f0e0 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
1f0f0 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
1f100 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1f110 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
1f120 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
1f130 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
1f140 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
1f150 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
1f160 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
1f170 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1f180 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
1f190 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
1f1a0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
1f1b0 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
1f1c0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1f1d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f1e0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
1f1f0 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
1f200 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
1f210 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1f220 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
1f230 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
1f240 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
1f250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
1f260 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
1f270 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
1f280 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f290 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1f2a0 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
1f2b0 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
1f2c0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
1f2d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1f2e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
1f2f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1f300 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1f310 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f320 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1f330 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1f340 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
1f350 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f360 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
1f370 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
1f380 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
1f390 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
1f3a0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
1f3b0 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
1f3c0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
1f3d0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
1f3e0 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
1f3f0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
1f400 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
1f410 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
1f420 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
1f430 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1f440 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
1f450 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
1f460 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
1f470 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
1f480 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
1f490 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
1f4a0 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
1f4b0 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
1f4c0 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
1f4d0 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
1f4e0 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
1f4f0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
1f500 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
1f510 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
1f520 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
1f530 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
1f540 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1f550 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
1f560 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
1f570 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
1f580 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
1f590 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
1f5a0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1f5b0 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
1f5c0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f5d0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
1f5e0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
1f5f0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
1f600 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1f610 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
1f620 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
1f630 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1f640 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f650 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1f660 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1f670 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
1f680 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1f690 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f6a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1f6b0 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
1f6c0 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
1f6d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1f6e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1f6f0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
1f700 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1f710 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1f720 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
1f730 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
1f740 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
1f750 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
1f760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1f770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f780 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f790 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
1f7a0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1f7b0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
1f7c0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1f7d0 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
1f7e0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
1f7f0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
1f800 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1f810 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1f820 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
1f830 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1f840 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1f850 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1f860 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
1f870 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1f880 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1f890 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
1f8a0 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
1f8b0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1f8c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f8d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f8e0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f8f0 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
1f900 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63  ile was just suc
1f910 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
1f920 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64  . Set Pager.need
1f930 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20  Sync .    ** to 
1f940 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74  zero and clear t
1f950 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
1f960 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70  NC flag on all p
1f970 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  agess..    */.  
1f980 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1f990 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
1f9a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1f9b0 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ed = 1;.    pPag
1f9c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
1f9d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f9e0 4f 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Off;.    sqlite3
1f9f0 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
1fa00 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
1fa10 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ache);.  }..  re
1fa20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fa30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
1fa40 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
1fa50 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
1fa60 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1fa70 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
1fa80 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
1fa90 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
1faa0 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
1fab0 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
1fac0 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
1fad0 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
1fae0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1faf0 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
1fb00 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
1fb10 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
1fb20 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
1fb30 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
1fb40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
1fb50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1fb60 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
1fb70 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
1fb80 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
1fb90 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
1fba0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
1fbb0 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
1fbc0 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
1fbd0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
1fbe0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
1fbf0 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
1fc00 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
1fc10 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
1fc20 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
1fc30 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
1fc40 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
1fc50 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
1fc60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fc70 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
1fc80 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
1fc90 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
1fca0 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
1fcb0 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
1fcc0 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
1fcd0 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
1fce0 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
1fcf0 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
1fd00 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
1fd10 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
1fd20 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
1fd30 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
1fd40 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
1fd50 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
1fd60 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
1fd70 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1fd80 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
1fd90 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
1fda0 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
1fdb0 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
1fdc0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
1fdd0 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
1fde0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
1fdf0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
1fe00 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
1fe10 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
1fe20 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
1fe30 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
1fe40 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
1fe50 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
1fe60 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
1fe70 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
1fe80 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
1fe90 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
1fea0 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
1feb0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
1fec0 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
1fed0 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
1fee0 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
1fef0 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
1ff00 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
1ff10 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
1ff20 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
1ff30 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
1ff40 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1ff50 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
1ff60 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
1ff70 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1ff80 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
1ff90 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
1ffa0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
1ffb0 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
1ffc0 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
1ffd0 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
1ffe0 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
1fff0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
20000 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
20010 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
20020 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
20030 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
20040 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20060 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
20070 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
200a0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28  n code */..  if(
200b0 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30 29   NEVER(pList==0)
200c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
200d0 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
200e0 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
200f0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
20100 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
20110 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
20120 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
20130 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
20140 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
20150 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
20160 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
20170 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
20180 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73  ing.  ** call is
20190 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
201a0 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
201b0 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
201c0 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
201d0 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
201e0 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
201f0 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
20200 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
20210 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
20220 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
20230 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
20240 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
20250 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
20260 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
20270 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
20280 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
20290 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
202a0 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
202b0 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
202c0 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
202d0 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
202e0 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
202f0 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
20300 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
20310 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
20320 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
20330 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
20340 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
20350 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
20360 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
20370 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
20380 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
20390 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
203a0 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
203b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
203c0 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
203d0 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
203e0 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
203f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20400 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
20410 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
20420 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
20430 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
20440 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
20450 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
20460 73 65 57 61 6c 28 70 4c 69 73 74 2d 3e 70 50 61  seWal(pList->pPa
20470 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
20480 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
20490 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
204a0 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
204b0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
204c0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
204d0 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  OCK);..  /* If t
204e0 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
204f0 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
20500 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
20510 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
20520 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
20530 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
20540 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
20550 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
20560 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
20570 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
20580 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
20590 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
205a0 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
205b0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
205c0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
205d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
205e0 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
205f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
20600 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
20610 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
20620 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
20630 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
20640 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
20650 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
20660 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
20670 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
20680 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
20690 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
206a0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
206b0 7a 65 20 3e 20 28 70 50 61 67 65 72 2d 3e 64 62  ze > (pPager->db
206c0 4f 72 69 67 53 69 7a 65 2b 31 29 20 26 26 20 69  OrigSize+1) && i
206d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
206e0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
206f0 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
20700 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20710 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
20720 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
20730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
20740 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
20750 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
20760 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26  NTL_SIZE_HINT, &
20770 73 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 0a 20 20  szFile);.  }..  
20780 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
20790 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
207a0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
207b0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
207c0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
207d0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
207e0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
207f0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
20800 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
20810 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
20820 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
20830 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
20840 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
20850 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
20860 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
20870 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
20880 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
20890 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
208a0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
208b0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
208c0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
208d0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
208e0 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
208f0 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
20900 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
20910 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
20920 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
20930 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
20940 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
20950 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
20960 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
20970 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
20980 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
20990 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
209a0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
209b0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
209c0 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
209d0 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
209e0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
209f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a10 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
20a20 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
20a30 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
20a40 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
20a50 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
20a60 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
20a70 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
20a80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
20a90 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
20aa0 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
20ab0 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
20ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20ad0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
20ae0 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
20af0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
20b00 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
20b10 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
20b20 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
20b30 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
20b40 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
20b50 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
20b60 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
20b70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
20b80 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
20b90 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
20ba0 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
20bb0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
20bc0 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
20bd0 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
20be0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
20bf0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
20c00 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
20c10 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
20c20 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
20c30 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
20c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20c50 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
20c60 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
20c70 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
20c80 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
20c90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
20ca0 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
20cb0 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
20cc0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
20cd0 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
20ce0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
20cf0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
20d00 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
20d10 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
20d20 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
20d30 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
20d40 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
20d50 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
20d70 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
20d80 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
20d90 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
20da0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
20db0 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
20dc0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
20dd0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
20de0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
20df0 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
20e00 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
20e10 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20  ager->nWrite);. 
20e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20e30 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
20e40 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
20e50 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
20e60 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
20e70 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
20e80 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
20e90 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68   pList->pageHash
20ea0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
20eb0 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  h(pList);.#endif
20ec0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
20ed0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
20ee0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20ef0 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68  ./*.** Ensure th
20f00 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  at the sub-journ
20f10 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  al file is open.
20f20 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
20f30 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a  y open, this .**
20f40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
20f50 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
20f60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20f70 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
20f80 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
20f90 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53  o plan. An .** S
20fa0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
20fb0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
20fc0 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
20fd0 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
20fe0 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  n() .** fails..*
20ff0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
21000 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
21010 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
21020 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21030 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
21040 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
21050 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
21060 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
21070 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21080 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
21090 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
210a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
210b0 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
210c0 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20  ager->sjfd);.   
210d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
210e0 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
210f0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
21100 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >sjfd, SQLITE_OP
21110 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
21120 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21130 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21140 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
21150 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
21160 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
21170 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
21180 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74  nal. .** It is t
21190 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
211a0 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65  nsibility to use
211b0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
211c0 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a  e() to check .**
211d0 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c   that it is real
211e0 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ly required befo
211f0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
21200 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
21210 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
21220 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
21230 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
21240 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
21250 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
21260 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
21270 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
21280 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
21290 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
212a0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
212b0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
212c0 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
212d0 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
212e0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
212f0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
21300 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
21310 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
21320 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
21330 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
21340 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
21350 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
21360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
21370 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
21380 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
21390 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
213a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
213b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
213c0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
213d0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
213e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
213f0 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  {..    /* Open t
21400 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
21410 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
21420 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
21430 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  d */.    assert(
21440 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
21450 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
21460 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
21470 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55  ->jfd) || pagerU
21480 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
21490 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
214a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
214b0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75  ) || pPager->nSu
214c0 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  bRec==0 );.    a
214d0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
214e0 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  al(pPager) .    
214f0 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f       || pageInJo
21500 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20  urnal(pPg) .    
21510 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e       || pPg->pgn
21520 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
21530 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20  Size .    );.   
21540 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
21550 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20  rnal(pPager);.. 
21560 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
21570 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65  -journal was ope
21580 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
21590 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79   (or was already
215a0 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77   open),.    ** w
215b0 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
215c0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
215d0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69   file.  */.    i
215e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
215f0 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
21600 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
21610 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66  ta;.      i64 of
21620 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  fset = pPager->n
21630 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
21640 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
21650 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
21660 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
21670 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
21680 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
21690 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
216a0 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
216b0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
216c0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
216d0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
216e0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
216f0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
21700 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
21710 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
21720 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
21730 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
21740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21750 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21760 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
21770 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
21780 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
21790 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
217a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
217b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
217c0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
217d0 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
217e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
217f0 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
21800 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
21810 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
21820 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
21830 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21840 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
21850 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
21860 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
21870 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
21880 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
21890 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
218a0 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
218b0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
218c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
218d0 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
218e0 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
218f0 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
21900 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
21910 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
21920 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
21930 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
21940 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
21950 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
21960 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
21970 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
21980 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
21990 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
219a0 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
219b0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
219c0 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
219d0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
219e0 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
219f0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
21a00 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
21a10 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
21a20 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
21a30 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
21a40 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
21a50 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
21a60 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
21a70 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
21a80 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
21a90 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
21aa0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
21ab0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
21ac0 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
21ad0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
21ae0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
21af0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
21b00 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
21b10 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
21b20 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
21b30 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
21b40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
21b50 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
21b60 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
21b70 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
21b80 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
21b90 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
21ba0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
21bb0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
21bc0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
21bd0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
21be0 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
21bf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
21c00 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
21c10 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
21c20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21c30 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
21c40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21c50 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
21c60 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
21c70 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
21c80 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
21c90 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
21ca0 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  he doNotSyncSpil
21cb0 6c 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75  l flag is set du
21cc0 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20  ring times when 
21cd0 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a  doing a sync of.
21ce0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e    ** journal (an
21cf0 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68  d adding a new h
21d00 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c  eader) is not al
21d10 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63  lowed.  This occ
21d20 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
21d30 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
21d40 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69  PagerWrite() whi
21d50 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75  le trying to jou
21d60 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20  rnal multiple.  
21d70 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69  ** pages belongi
21d80 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ng to the same s
21d90 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ector..  **.  **
21da0 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
21db0 66 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c  flag inhibits al
21dc0 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67  l cache spilling
21dd0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
21de0 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
21df0 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71  ot a sync is req
21e00 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  uired.  This is 
21e10 73 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  set during a rol
21e20 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lback..  **.  **
21e30 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73   Spilling is als
21e40 6f 20 69 6e 68 69 62 69 74 65 64 20 77 68 65 6e  o inhibited when
21e50 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
21e60 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  te..  */.  if( p
21e70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
21e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21e90 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
21ea0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65  >doNotSpill ) re
21eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21ec0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
21ed0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20  NotSyncSpill && 
21ee0 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
21ef0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
21f00 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
21f10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
21f20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
21f30 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  0;.  if( pagerUs
21f40 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21f50 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
21f60 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
21f70 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
21f80 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28   log. */.    if(
21f90 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
21fa0 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20  e(pPg) ){ .     
21fb0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
21fc0 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20  Page(pPg); .    
21fd0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
21fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21ff0 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
22000 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
22010 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
22020 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  }.  }else{.  .  
22030 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
22040 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
22050 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
22060 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
22070 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
22080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
22090 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
220a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  ;.      rc = syn
220b0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
220c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
220d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 0a 20 20  SQLITE_OK && .  
220e0 20 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e        !(pPager->
220f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
22100 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
22110 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20  EMORY) &&.      
22120 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76    !(sqlite3OsDev
22130 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
22140 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
22150 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
22160 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29  _APPEND).      )
22170 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
22180 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
22190 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
221a0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
221b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
221c0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
221d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
221e0 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72  this page is lar
221f0 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ger than the cur
22200 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20  rent size of.   
22210 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
22220 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e   image, it may n
22230 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65  eed to be writte
22240 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
22250 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69  rnal..    ** Thi
22260 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
22270 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
22280 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
22290 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
222a0 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77     ** actually w
222b0 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
222c0 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
222d0 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
222e0 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66  * Consider the f
222f0 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63  ollowing sequenc
22300 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20  e of events:.   
22310 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47   **.    **   BEG
22320 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c  IN;.    **     <
22330 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a  journal page X>.
22340 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69      **     <modi
22350 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  fy page X>.    *
22360 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
22370 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sp;.    **      
22380 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73   <shrink databas
22390 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65  e file to Y page
223a0 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s>.    **       
223b0 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65  pagerStress(page
223c0 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52   X).    **     R
223d0 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20  OLLBACK TO sp;. 
223e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
223f0 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e  (X>Y), then when
22400 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20   pagerStress is 
22410 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69  called page X wi
22420 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
22430 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  n.    ** out to 
22440 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22450 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64  e, but will be d
22460 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ropped from the 
22470 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20  cache. Then,.   
22480 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
22490 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
224a0 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65  p" statement, re
224b0 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c  ading page X wil
224c0 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61  l read.    ** da
224d0 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
224e0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
224f0 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
22500 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
22510 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e  .    ** was when
22520 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22530 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73   started, not as
22540 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41   it was when "SA
22550 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20  VEPOINT sp".    
22560 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e  ** was executed.
22570 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
22580 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
22590 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
225a0 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67  ent data for pag
225b0 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  e X into the .  
225c0 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
225d0 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74   file now (if it
225e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
225f0 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20  there), so that 
22600 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  it will.    ** b
22610 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
22620 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
22630 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
22640 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20  CK TO sp" is .  
22650 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20    ** executed.. 
22660 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45     */.    if( NE
22670 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d  VER(.        rc=
22680 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
22690 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
226a0 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65  dbSize && subjRe
226b0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a  quiresPage(pPg).
226c0 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72      ) ){.      r
226d0 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
226e0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
226f0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
22700 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
22710 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
22720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22730 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  . */.    if( rc=
22740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22750 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
22760 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
22770 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
22780 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
22790 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
227a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
227b0 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
227c0 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
227d0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
227e0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
227f0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
22800 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
22810 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
22820 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
22830 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
22840 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  );.}.../*.** All
22850 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
22860 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72  lize a new Pager
22870 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20   object and put 
22880 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a  a pointer to it.
22890 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20  ** in *ppPager. 
228a0 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  The pager should
228b0 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66   eventually be f
228c0 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20  reed by passing 
228d0 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  it.** to sqlite3
228e0 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a  PagerClose()..**
228f0 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
22900 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
22910 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
22920 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
22930 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  pen..** If zFile
22940 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
22950 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
22960 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
22970 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
22980 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
22990 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
229a0 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c  d. Temporary fil
229b0 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65  es are be delete
229c0 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
229d0 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ly when they are
229e0 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c   closed. If zFil
229f0 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
22a00 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c  y:" then .** all
22a10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
22a20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49  held in cache. I
22a30 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
22a40 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20  en to disk. .** 
22a50 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
22a60 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
22a70 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
22a80 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ase..**.** The n
22a90 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20  Extra parameter 
22aa0 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
22ab0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
22ac0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
22ad0 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65  .** along with e
22ae0 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e  ach page referen
22af0 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69  ce. This space i
22b00 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  s available to t
22b10 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74  he user.** via t
22b20 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
22b30 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a  etExtra() API..*
22b40 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
22b50 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
22b60 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
22b70 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
22b80 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
22b90 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
22ba0 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
22bb0 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
22bc0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
22bd0 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d   of the PAGER_OM
22be0 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50  IT_JOURNAL and P
22bf0 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
22c00 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
22c10 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
22c20 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
22c30 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
22c40 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
22c50 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
22c60 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
22c70 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
22c80 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
22c90 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
22ca0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
22cb0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
22cc0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
22cd0 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
22ce0 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
22cf0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
22d00 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
22d10 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
22d20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
22d30 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
22d40 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
22d50 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
22d60 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
22d70 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
22d80 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
22d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
22da0 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
22db0 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
22dc0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
22dd0 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
22de0 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
22df0 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
22e00 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
22e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
22e20 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
22e30 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
22e40 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
22e50 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
22e60 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
22e70 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
22e80 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
22e90 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
22ea0 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
22eb0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
22ec0 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
22ed0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22ee0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
22ef0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
22f00 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
22f10 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
22f20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
22f30 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
22f40 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
22f50 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
22f60 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
22f70 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
22f80 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
22f90 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
22fa0 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
22fb0 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
22fc0 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
22fd0 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
22fe0 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
22ff0 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
23000 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
23010 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
23020 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
23030 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
23040 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
23050 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
23060 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
23070 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
23080 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
23090 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
230a0 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
230b0 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
230c0 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
230d0 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
230e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
230f0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
23100 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
23110 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
23120 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
23130 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
23140 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
23150 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
23160 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
23170 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
23180 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
23190 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
231a0 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
231b0 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
231c0 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
231d0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
231e0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
231f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
23200 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
23210 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
23220 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
23230 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
23240 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
23250 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
23260 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61  l */.  int noRea
23270 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
23280 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
23290 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65  CK)!=0;  /* True
232a0 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f   to omit read-lo
232b0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  ck */.  int pcac
232c0 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  heSize = sqlite3
232d0 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20  PcacheSize();   
232e0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
232f0 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61  allocate for PCa
23300 63 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50  che */.  u16 szP
23310 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
23320 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
23330 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ZE;  /* Default 
23340 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  page size */..  
23350 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
23360 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
23370 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
23380 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
23390 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
233a0 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
233b0 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
233c0 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
233d0 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
233e0 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
233f0 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
23400 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
23410 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
23420 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
23430 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
23440 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
23450 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
23460 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
23470 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
23480 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
23490 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
234a0 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
234b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
234c0 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
234d0 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
234e0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
234f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
23500 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
23510 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
23520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
23530 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
23540 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
23550 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
23560 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
23570 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
23580 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
23590 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
235a0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
235b0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
235c0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
235d0 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
235e0 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
235f0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
23600 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
23610 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
23620 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20  *ppPager = 0;.. 
23630 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
23640 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
23650 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
23660 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
23670 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
23680 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
23690 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
236a0 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
236b0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
236c0 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
236d0 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
236e0 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
236f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
23700 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
23710 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50  ame[0] ){.    nP
23720 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
23730 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
23740 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
23750 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
23760 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
23770 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
23780 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
23790 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
237a0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
237b0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
237c0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
237d0 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
237e0 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
237f0 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
23800 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
23810 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
23820 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
23830 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
23840 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
23850 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
23860 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
23870 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
23880 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23890 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
238a0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
238b0 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
238c0 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
238d0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
238e0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
238f0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
23900 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23910 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
23920 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
23930 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
23940 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
23950 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
23960 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
23970 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
23980 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
23990 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
239a0 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
239b0 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
239c0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
239d0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
239e0 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
239f0 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
23a00 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
23a10 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
23a20 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
23a30 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
23a40 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
23a50 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
23a60 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
23a70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23a80 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
23a90 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
23aa0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
23ab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23ac0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
23ad0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
23ae0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
23af0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
23b00 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
23b10 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
23b20 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
23b30 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
23b40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
23b50 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
23b60 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
23b70 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
23b80 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
23b90 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
23ba0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
23bb0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
23bc0 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
23be0 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
23bf0 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
23c00 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
23c10 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
23c20 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
23c30 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23c40 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
23c50 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
23c60 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
23c70 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23c80 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
23c90 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
23ca0 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
23cb0 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
23cc0 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
23cd0 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
23ce0 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
23cf0 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
23d00 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
23d10 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
23d20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
23d30 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
23d40 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
23d50 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
23d60 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
23d70 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
23d80 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
23d90 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
23da0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
23db0 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
23dc0 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
23dd0 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
23de0 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
23df0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
23e00 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
23e10 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
23e20 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
23e30 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
23e40 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
23e50 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
23e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23e70 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
23e80 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
23e90 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20  name + 1 +      
23ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
23eb0 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
23ec0 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20  athname + 8 + 1 
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ee0 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b  zJournal */.  );
23ef0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
23f00 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
23f10 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
23f20 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  R(journalFileSiz
23f30 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50  e)) );.  if( !pP
23f40 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
23f50 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
23f60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
23f70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
23f80 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20    pPager =      
23f90 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29          (Pager*)
23fa0 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72  (pPtr);.  pPager
23fb0 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28  ->pPCache =    (
23fc0 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d  PCache*)(pPtr +=
23fd0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
23fe0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61  pPager)));.  pPa
23ff0 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c  ger->fd =   (sql
24000 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
24010 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68   += ROUND8(pcach
24020 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65  eSize));.  pPage
24030 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74  r->sjfd = (sqlit
24040 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
24050 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73  = ROUND8(pVfs->s
24060 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61  zOsFile));.  pPa
24070 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c  ger->jfd =  (sql
24080 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
24090 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
240a0 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
240b0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28  zFilename =    (
240c0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a  char*)(pPtr += j
240d0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
240e0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
240f0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
24100 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
24110 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
24120 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d  e Pager.zFilenam
24130 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  e and Pager.zJou
24140 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66  rnal buffers, if
24150 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
24160 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
24170 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
24180 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
24190 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
241a0 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65  ame + 1);.    me
241b0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
241c0 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
241d0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
241e0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
241f0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
24200 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
24210 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
24220 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
24230 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
24240 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20  urnal", 8);.    
24250 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  if( pPager->zFil
24260 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50  ename[0]==0 ) pP
24270 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30  ager->zJournal[0
24280 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
24290 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
242a0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
242b0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
242c0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
242d0 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
242e0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
242f0 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
24300 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
24310 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26   zFilename[0] &&
24320 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69   !memDb ){.    i
24330 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24350 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
24360 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
24370 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
24380 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
24390 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
243a0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
243b0 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
243c0 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
243d0 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
243e0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
243f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
24400 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
24410 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
24420 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
24430 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61  .    ** choose a
24440 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
24450 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61  ze in case we ha
24460 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ve to create the
24470 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
24480 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
24490 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
244a0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
244b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
244c0 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
244d0 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
244e0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
244f0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
24500 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
24510 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b  ze().    **    +
24520 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
24530 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
24540 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
24550 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  cally..    */.  
24560 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24570 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79  _OK && !readOnly
24580 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63   ){.      setSec
24590 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
245a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51  .      assert(SQ
245b0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
245c0 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d  E_SIZE<=SQLITE_M
245d0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
245e0 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28  SIZE);.      if(
245f0 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
24600 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
24610 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
24620 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
24630 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
24640 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
24650 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
24660 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
24670 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
24680 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65  SIZE;.        }e
24690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
246a0 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36  zPageDflt = (u16
246b0 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
246c0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ize;.        }. 
246d0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
246e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
246f0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b  IC_WRITE.      {
24700 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63  .        int iDc
24710 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
24720 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
24730 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
24740 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
24750 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
24760 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
24770 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
24780 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24790 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
247a0 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
247b0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
247c0 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
247d0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
247e0 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
247f0 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44    for(ii=szPageD
24800 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  flt; ii<=SQLITE_
24810 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
24820 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
24830 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
24840 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
24850 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
24860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24870 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
24880 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
248a0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65  endif.    }.  }e
248b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
248c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
248d0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
248e0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
248f0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
24900 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
24910 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
24920 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
24930 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
24940 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
24950 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
24960 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
24970 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
24980 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
24990 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
249a0 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
249b0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
249c0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
249d0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
249e0 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
249f0 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
24a00 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
24a10 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
24a20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
24a30 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
24a40 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a  ournal..    */ .
24a50 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
24a60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
24a70 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
24a80 55 53 49 56 45 3b 0a 20 20 20 20 72 65 61 64 4f  USIVE;.    readO
24a90 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
24aa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
24ab0 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
24ac0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
24ad0 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
24ae0 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
24af0 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
24b00 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
24b10 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
24b20 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
24b30 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
24b40 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
24b50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24b60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
24b70 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
24b80 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
24b90 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
24ba0 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
24bb0 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
24bc0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
24bd0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
24be0 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
24bf0 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69  r occurred in ei
24c00 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63  ther of the bloc
24c10 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ks above, free t
24c20 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73  he .  ** Pager s
24c30 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
24c40 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
24c50 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
24c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
24c70 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54  ert( !pPager->pT
24c80 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73  mpSpace );.    s
24c90 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
24ca0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
24cb0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
24cc0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
24cd0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  rc;.  }..  /* In
24ce0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61  itialize the PCa
24cf0 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  che object. */. 
24d00 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c   assert( nExtra<
24d10 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61  1000 );.  nExtra
24d20 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
24d30 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
24d40 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
24d50 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
24d60 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
24d70 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61         !memDb?pa
24d80 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f  gerStress:0, (vo
24d90 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61  id *)pPager, pPa
24da0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
24db0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
24dc0 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
24dd0 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
24de0 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
24df0 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
24e00 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
24e10 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
24e20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
24e30 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
24e40 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
24e50 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
24e60 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
24e70 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26   = (noReadlock &
24e80 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30  & readOnly) ?1:0
24e90 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
24ea0 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
24eb0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
24ec0 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
24ed0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
24ee0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
24ef0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
24f00 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a   (u8)memDb;.  /*
24f10 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
24f20 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
24f30 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
24f40 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
24f50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
24f60 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
24f70 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
24f80 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
24f90 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
24fa0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
24fb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
24fc0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
24fd0 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
24fe0 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
24ff0 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20  ER_UNLOCK) );.  
25000 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
25010 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
25020 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
25030 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
25040 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
25050 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
25060 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
25070 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
25080 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
25090 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
250a0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
250b0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
250c0 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
250d0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
250e0 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
250f0 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
25100 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
25110 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
25120 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
25130 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
25140 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
25150 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
25160 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
25170 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
25180 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  */.  assert( use
25190 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
251a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
251b0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
251c0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
251d0 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
251e0 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
251f0 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
25200 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
25210 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
25220 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
25230 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
25240 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
25250 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
25260 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
25270 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
25280 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
25290 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
252a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
252b0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
252c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
252d0 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
252e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
252f0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
25300 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
25310 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
25320 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
25330 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
25340 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
25350 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
25360 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
25370 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
25380 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
25390 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
253a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
253b0 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
253c0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
253d0 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
253e0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
253f0 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
25400 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
25410 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
25420 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
25430 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
25440 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
25450 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50  sh)); */..  *ppP
25460 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
25470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25480 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  K;.}..../*.** Th
25490 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
254a0 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
254b0 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
254c0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
254d0 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
254e0 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
254f0 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
25500 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
25510 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
25520 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
25530 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
25540 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
25550 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
25560 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
25570 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
25580 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
25590 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
255a0 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
255b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
255c0 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
255d0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
255e0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
255f0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
25600 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
25610 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
25620 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
25630 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
25640 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25650 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
25660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
25670 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
25680 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
25690 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
256a0 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
256b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
256c0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
256d0 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
256e0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
256f0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
25700 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
25710 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
25720 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
25730 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
25740 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
25750 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
25760 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
25770 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
25780 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
25790 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
257a0 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
257b0 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
257c0 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
257d0 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
257e0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
257f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
25800 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
25810 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
25820 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
25830 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
25840 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
25850 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
25860 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
25870 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
25880 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
25890 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
258a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
258b0 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
258c0 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
258d0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
258e0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
258f0 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
25900 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
25910 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
25920 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
25930 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25940 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
25950 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
25960 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
25970 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
25980 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
25990 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
259a0 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
259b0 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
259c0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
259d0 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
259e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
259f0 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
25a00 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
25a10 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
25a20 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
25a30 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
25a40 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
25a50 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
25a60 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
25a70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
25a80 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
25a90 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
25aa0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
25ab0 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
25ac0 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
25ad0 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
25ae0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
25af0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
25b00 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
25b10 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
25b20 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
25b30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
25b40 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
25b50 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
25b60 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
25b70 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
25b80 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
25b90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
25ba0 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
25bb0 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
25bc0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25bd0 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
25be0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
25bf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
25c00 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
25c10 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
25c20 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
25c30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25c40 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41  ate <= PAGER_SHA
25c50 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RED );.  assert(
25c60 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20   jrnlOpen==0 || 
25c70 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  ( sqlite3OsDevic
25c80 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
25c90 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a  (pPager->jfd) &.
25ca0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
25cb0 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
25cc0 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20  N_OPEN.  ));..  
25cd0 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  *pExists = 0;.  
25ce0 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
25cf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25d00 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
25d10 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
25d20 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
25d30 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
25d40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
25d50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69  SQLITE_OK && exi
25d60 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  sts ){.    int l
25d70 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20  ocked;          
25d80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25d90 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68  f some process h
25da0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
25db0 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  lock */..    /* 
25dc0 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68  Race condition h
25dd0 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72  ere:  Another pr
25de0 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65  ocess might have
25df0 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68   been holding th
25e00 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53  e.    ** the RES
25e10 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68  ERVED lock and h
25e20 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70  ave a journal op
25e30 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65  en at the sqlite
25e40 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20  3OsAccess() .   
25e50 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20   ** call above, 
25e60 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20  but then delete 
25e70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
25e80 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65  drop the lock be
25e90 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67  fore.    ** we g
25ea0 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  et to the follow
25eb0 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65  ing sqlite3OsChe
25ec0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
25ed0 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a   call.  If that.
25ee0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61      ** is the ca
25ef0 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
25f00 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65   might think the
25f10 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
25f20 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  nal when.    ** 
25f30 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73  in fact there is
25f40 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73   none.  This res
25f50 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d  ults in a false-
25f60 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77  positive which w
25f70 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65  ill.    ** be de
25f80 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20  alt with by the 
25f90 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65  playback routine
25fa0 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e  .  Ticket #3883.
25fb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
25fc0 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
25fd0 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
25fe0 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
25ff0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
26000 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b  LITE_OK && !lock
26010 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ed ){.      int 
26020 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a  nPage;..      /*
26030 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20   Check the size 
26040 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
26050 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73  file. If it cons
26060 69 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c  ists of 0 pages,
26070 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64  .      ** then d
26080 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
26090 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20  l file. See the 
260a0 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61  header comment a
260b0 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20  bove for .      
260c0 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67  ** the reasoning
260d0 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74   here.  Delete t
260e0 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  he obsolete jour
260f0 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20  nal file under. 
26100 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56       ** a RESERV
26110 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64  ED lock to avoid
26120 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
26130 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69   and to avoid vi
26140 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  olating.      **
26150 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20   [H33020]..     
26160 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
26170 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
26180 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
26190 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
261a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
261b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
261c0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
261d0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
261e0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
261f0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
26200 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
26210 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
26220 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)==SQLITE_OK
26230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26240 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
26250 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
26260 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
26270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
26280 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
26290 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
262a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
262b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
262c0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
262d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
262e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
262f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
26300 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
26310 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
26320 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
26330 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
26340 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
26350 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
26360 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
26370 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
26380 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
26390 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
263a0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
263b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
263c0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
263d0 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
263e0 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
263f0 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
26400 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
26410 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
26420 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
26430 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
26440 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
26450 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
26460 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
26470 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
26480 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
26490 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
264a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
264b0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
264c0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
264d0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
264e0 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
264f0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
26500 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26510 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
26520 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
26530 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26540 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
26550 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
26560 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
26570 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26580 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
26590 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
265a0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
265b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
265c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
265d0 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
265e0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
265f0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
26600 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
26610 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26620 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
26630 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
26640 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
26650 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
26660 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
26670 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
26680 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
26690 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
266a0 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
266b0 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
266c0 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61         ** its ha
266d0 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
266e0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
266f0 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
26700 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
26710 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
26720 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
26730 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
26740 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
26750 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
26760 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
26770 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
26780 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
26790 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
267a0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
267b0 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
267c0 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
267d0 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
267e0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
267f0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
26800 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
26810 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
26820 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
26830 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
26840 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
26850 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
26860 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
26870 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
26880 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
26890 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
268a0 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
268b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
268c0 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
268d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
268e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
268f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26900 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
26910 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
26920 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
26930 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
26940 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
26950 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
26960 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26970 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
26980 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
26990 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
269a0 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
269b0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
269c0 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
269d0 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
269e0 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
269f0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
26a00 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
26a10 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
26a20 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
26a30 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
26a40 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
26a50 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
26a60 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
26a70 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
26a80 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
26a90 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
26aa0 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f  UNLOCK state (no
26ab0 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20   lock held.**   
26ac0 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
26ad0 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61  se file), then a
26ae0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
26af0 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a  e to obtain a.**
26b00 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63        SHARED loc
26b10 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
26b20 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74  e file. Immediat
26b30 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
26b40 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
26b50 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
26b60 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
26b70 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f  checked for a ho
26b80 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20  t-journal,.**   
26b90 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79     which is play
26ba0 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65  ed back if prese
26bb0 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e  nt. Following an
26bc0 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a  y hot-journal .*
26bd0 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c  *      rollback,
26be0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
26bf0 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76   the cache are v
26c00 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63  alidated by chec
26c10 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  king.**      the
26c20 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72   'change-counter
26c30 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64  ' field of the d
26c40 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
26c50 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  der and.**      
26c60 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65  discarded if the
26c70 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62  y are found to b
26c80 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  e invalid..**.**
26c90 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67     2) If the pag
26ca0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
26cb0 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c   exclusive-mode,
26cc0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63   and there are c
26cd0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
26ce0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
26cf0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e  references to an
26d00 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20  y pages, and is 
26d10 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
26d20 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e  te,.**      then
26d30 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
26d40 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65  ade to clear the
26d50 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20   error state by 
26d60 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20  discarding.**   
26d70 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20     the contents 
26d80 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
26d90 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61  e and rolling ba
26da0 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72  ck any open jour
26db0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  nal.**      file
26dc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
26dd0 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69 62  peration describ
26de0 65 64 20 62 79 20 28 32 29 20 61 62 6f 76 65 20  ed by (2) above 
26df0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
26e00 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20  , and if the.** 
26e10 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65  pager is in an e
26e20 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72  rror state other
26e30 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c   than SQLITE_FUL
26e40 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  L when this is c
26e50 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  alled,.** the er
26e60 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
26e70 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
26e80 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74 74 65  . It is permitte
26e90 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a  d to read the.**
26ea0 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 20 69   database when i
26eb0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72  n SQLITE_FULL er
26ec0 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
26ed0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65   Otherwise, if e
26ee0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
26ef0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
26f00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
26f10 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f  If an.** IO erro
26f20 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c  r occurs while l
26f30 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  ocking the datab
26f40 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f  ase, checking fo
26f50 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  r a hot-journal.
26f60 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69  ** file or rolli
26f70 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
26f80 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
26f90 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
26fa0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
26fb0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
26fc0 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
26fd0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
26fe0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
26ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
27000 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
27010 74 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d  t isErrorReset =
27020 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
27030 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 63 6f   /* True if reco
27040 76 65 72 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f  vering from erro
27050 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a  r state */..  /*
27060 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
27070 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
27080 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c  m b-tree and onl
27090 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  y when there are
270a0 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e   no.  ** outstan
270b0 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
270c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
270d0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
270e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
270f0 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
27100 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  (MEMDB && pPager
27110 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65  ->errCode) ){ re
27120 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
27130 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f 2a 20 49 66  Code; }..  /* If
27140 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
27150 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74  s in an error-st
27160 61 74 65 2c 20 6e 6f 77 20 69 73 20 61 20 63 68  ate, now is a ch
27170 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20  ance to clear.  
27180 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69  ** the error. Di
27190 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
271a0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
271b0 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 62 61  cache and rollba
271c0 63 6b 0a 20 20 2a 2a 20 61 6e 79 20 68 6f 74 20  ck.  ** any hot 
271d0 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66  journal in the f
271e0 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 2a 2f  ile-system..  */
271f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
27200 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  rrCode ){.    if
27210 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27220 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
27230 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  >zJournal ){.   
27240 20 20 20 69 73 45 72 72 6f 72 52 65 73 65 74 20     isErrorReset 
27250 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
27260 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
27270 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
27280 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
27290 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
272a0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
272b0 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  er) ){.    rc = 
272c0 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
272d0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
272e0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
272f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
27300 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73  GER_UNLOCK || is
27310 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20  ErrorReset ){.  
27320 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
27330 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
27340 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69  ger->pVfs;.    i
27350 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20  nt isHotJournal 
27360 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
27370 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
27380 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
27390 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
273a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
273b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
273c0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
273d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
273e0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
273f0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
27400 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
27410 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SHARED;.    }els
27420 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
27430 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
27440 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
27450 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
27460 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27470 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
27480 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
27490 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
274a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
274b0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
274c0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  er, rc);.      }
274d0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
274e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
274f0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
27500 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
27510 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
27520 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
27530 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
27540 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
27550 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
27560 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
27570 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
27580 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
27590 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
275a0 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b  !isErrorReset ){
275b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
275c0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20  Pager->state <= 
275d0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
275e0 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
275f0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
27600 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b   &isHotJournal);
27610 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
27620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27630 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
27640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27650 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65     if( isErrorRe
27660 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72  set || isHotJour
27670 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nal ){.      /* 
27680 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
27690 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
276a0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
276b0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
276c0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
276d0 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
276e0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
276f0 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
27700 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
27710 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
27720 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
27730 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
27740 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
27750 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
27760 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
27770 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
27780 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
27790 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
277a0 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
277b0 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
277c0 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
277d0 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
277e0 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
277f0 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
27800 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
27810 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
27820 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
27830 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
27840 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
27850 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
27860 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
27870 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
27880 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
27890 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
278a0 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
278b0 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
278c0 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
278d0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
278e0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
278f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27900 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27910 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
27920 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
27930 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27940 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
27950 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
27960 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
27970 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27990 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
279a0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
279b0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
279c0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
279d0 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
279e0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
279f0 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
27a00 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70   }. .      /* Op
27a10 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
27a20 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
27a30 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
27a40 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
27a50 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
27a60 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
27a70 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
27a80 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
27a90 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  nd.      ** poss
27aa0 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
27ab0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
27ac0 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79  r on. On some sy
27ad0 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20  stems, the.     
27ae0 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29   ** OsTruncate()
27af0 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78   call used in ex
27b00 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
27b10 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65  ode also require
27b20 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61  s.      ** a rea
27b30 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e  d/write file han
27b40 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dle..      */.  
27b50 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
27b60 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
27b70 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
27b80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
27b90 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
27ba0 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  fs,pPager->zJour
27bb0 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53  nal,SQLITE_ACCES
27bc0 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a  S_EXISTS,&res);.
27bd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
27be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27bf0 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29         if( res )
27c00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
27c10 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
27c20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
27c30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
27c40 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
27c50 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
27c60 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
27c70 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
27c80 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
27c90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27ca0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
27cb0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
27cc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
27cd0 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
27ce0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
27cf0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
27d00 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27d10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
27d20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27d30 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
27d40 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
27d50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27d60 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
27d70 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
27d80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27d90 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
27da0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
27db0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
27dc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27dd0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
27de0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
27df0 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
27e00 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
27e10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
27e20 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
27e30 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
27e40 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
27e50 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
27e60 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
27e70 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
27e80 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
27e90 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
27ea0 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  it .            
27eb0 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
27ec0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
27ed0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
27ee0 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
27ef0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
27f00 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
27f10 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
27f20 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
27f30 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
27f40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
27f50 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
27f60 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
27f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27f80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
27f90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
27fb0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
27fc0 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74  ..      /* Reset
27fd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 74 61   the journal sta
27fe0 74 75 73 20 66 69 65 6c 64 73 20 74 6f 20 69 6e  tus fields to in
27ff0 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
28000 68 61 76 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a  have no.      **
28010 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
28020 6c 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  l at this time. 
28030 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
28040 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
28050 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
28060 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
28070 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
28080 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
28090 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
280a0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a  urnalHdr = 0;. .
280b0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
280c0 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  re the journal f
280d0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
280e0 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a  ced to disk. */.
280f0 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
28100 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
28110 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
28120 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
28130 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
28140 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
28150 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
28160 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
28170 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
28180 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
28190 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
281a0 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
281b0 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
281c0 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
281d0 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20  nt cache.  Sync 
281e0 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  the hot journal 
281f0 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20  before playing. 
28200 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20       ** it back 
28210 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73  since the proces
28220 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61  s that crashed a
28230 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20  nd left the hot 
28240 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
28250 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f   probably did no
28260 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65  t sync it and we
28270 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
28280 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20   always sync.   
28290 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
282a0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
282b0 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   it back..      
282c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  */.      if( isO
282d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
282e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
282f0 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
28300 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
28310 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28320 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28330 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
28340 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
28350 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   1);.        }. 
28360 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28380 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
28390 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
283a0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  c);.          go
283b0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
283c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
283d0 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
283e0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
283f0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
28400 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
28410 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
28420 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
28430 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
28440 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
28450 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
28460 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33 50  ckup || sqlite3P
28470 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
28480 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
28490 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
284a0 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
284b0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
284c0 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ired on the data
284d0 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20  base file.      
284e0 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
284f0 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
28500 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
28510 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
28520 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
28530 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
28540 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
28550 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
28560 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
28570 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
28580 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
28590 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
285a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
285b0 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  he..      **.   
285c0 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
285d0 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74  hanges is detect
285e0 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
285f0 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
28600 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ing.      ** at 
28610 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74  offset 24 into t
28620 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69  he file.  The fi
28630 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31  rst 4 of these 1
28640 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  6 bytes are.    
28650 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
28660 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
28670 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
28680 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
28690 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
286a0 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
286b0 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
286c0 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
286d0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65  .      ** a code
286e0 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
286f0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
28700 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73  There is a vanis
28710 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61  hingly small cha
28720 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67  nce that a chang
28730 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20  e will not be . 
28740 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
28750 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
28760 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
28770 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
28780 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  l that.      ** 
28790 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
287a0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
287b0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20      int nPage;. 
287c0 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
287d0 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
287e0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
287f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
28800 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
28810 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 0a  ager, &nPage);..
28820 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
28830 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
28840 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72       rc = pPager
28850 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
28860 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
28870 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
28880 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
28890 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
288a0 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
288b0 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
288c0 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
288d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
288e0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
288f0 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
28900 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
28910 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
28920 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28940 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
28950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
28970 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
28980 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
28990 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
289a0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
289b0 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
289c0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
289d0 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
289e0 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
289f0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
28a00 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
28a10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
28a20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
28a30 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
28a40 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
28a50 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
28a60 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
28a70 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74   a WAL file in t
28a80 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
28a90 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61  open this databa
28aa0 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a  se in WAL.    **
28ab0 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   mode. Otherwise
28ac0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
28ad0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73  function call is
28ae0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f   a no-op..    */
28af0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
28b00 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
28b10 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 66  pPager);.  }.. f
28b20 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
28b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28b40 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    /* pager_unloc
28b50 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
28b60 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  or exclusive mod
28b70 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  e and in-memory 
28b80 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20  databases. */.  
28b90 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
28ba0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
28bb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28bc0 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
28bd0 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
28be0 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
28bf0 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
28c00 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
28c10 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
28c20 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
28c30 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
28c40 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
28c50 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
28c60 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
28c70 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
28c80 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
28c90 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
28ca0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
28cb0 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
28cc0 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
28cd0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
28ce0 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
28cf0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
28d00 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
28d10 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33  {.  if( (sqlite3
28d20 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
28d30 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
28d40 3d 30 29 0a 20 20 20 26 26 20 28 21 70 50 61 67  =0).   && (!pPag
28d50 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
28d60 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
28d70 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b  rnalOff>0) .  ){
28d80 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
28d90 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
28da0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
28db0 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65  * Acquire a refe
28dc0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75  rence to page nu
28dd0 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67  mber pgno in pag
28de0 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67  er pPager (a pag
28df0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68  e.** reference h
28e00 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29  as type DbPage*)
28e10 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
28e20 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ed reference is 
28e30 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
28e40 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73   obtained, it is
28e50 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61   copied to *ppPa
28e60 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
28e70 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
28e80 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
28e90 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
28ea0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
28eb0 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
28ec0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
28ed0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
28ee0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
28ef0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
28f00 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
28f10 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
28f20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
28f30 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
28f40 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
28f50 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
28f60 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
28f70 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
28f80 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
28f90 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
28fa0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
28fb0 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
28fc0 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
28fd0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
28fe0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
28ff0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
29000 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
29010 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
29020 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
29030 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
29040 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
29050 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
29060 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
29070 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
29080 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
29090 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
290a0 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
290b0 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
290c0 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
290d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
290e0 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
290f0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
29100 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
29110 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
29120 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
29130 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
29140 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
29150 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
29160 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
29170 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
29180 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
29190 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
291a0 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
291b0 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
291c0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
291d0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
291e0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
291f0 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
29200 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
29210 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
29220 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
29230 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
29240 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
29250 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
29260 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65  occurs in two se
29270 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73  perate scenarios
29280 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
29290 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
292a0 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
292b0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
292c0 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
292d0 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
292e0 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
292f0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
29300 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
29310 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
29320 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
29330 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20   be filled with 
29340 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a  the data read.**
29350 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73        from the s
29360 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  avepoint journal
29370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  ..**.** If noCon
29380 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68  tent is true, th
29390 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75  en the data retu
293a0 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69  rned is zeroed i
293b0 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69  nstead of.** bei
293c0 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ng read from the
293d0 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
293e0 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74  ionally, the bit
293f0 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  s corresponding.
29400 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61  ** to pgno in Pa
29410 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28  ger.pInJournal (
29420 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  bitvec of pages 
29430 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20  already written 
29440 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  to the.** journa
29450 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
29460 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
29470 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
29480 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a  ecs of any open.
29490 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ** savepoints ar
294a0 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e  e set. This mean
294b0 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  s if the page is
294c0 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61   made writable a
294d0 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69  t any.** point i
294e0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73  n the future, us
294f0 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ing a call to sq
29500 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29510 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ), its contents.
29520 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a  ** will not be j
29530 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73  ournaled. This s
29540 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54  aves IO..**.** T
29550 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
29560 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
29570 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
29580 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
29590 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
295a0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
295b0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
295c0 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
295d0 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
295e0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  o sqlite3PagerLo
295f0 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
29600 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c  is routine and L
29610 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
29620 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
29630 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
29640 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
29650 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
29660 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
29670 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
29680 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
29690 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
296a0 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70  n whereas Lookup
296b0 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
296c0 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
296d0 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
296e0 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
296f0 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
29700 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
29710 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
29720 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
29730 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
29740 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c  sary..** Since L
29750 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
29760 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
29770 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
29780 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
29790 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
297a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
297b0 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
297c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
297d0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
297e0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
297f0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
29800 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
29810 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
29820 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
29830 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
29840 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
29850 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
29860 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
29870 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
29880 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
29890 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
298a0 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
298b0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
298c0 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
298d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  ;..  assert( ass
298e0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
298f0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
29900 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
29910 74 65 3e 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  te>PAGER_UNLOCK 
29920 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  );..  if( pgno==
29930 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
29940 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29950 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
29960 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
29970 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
29980 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
29990 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  or immediately. 
299a0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
299b0 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67   request the pag
299c0 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68  e from the PCach
299d0 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66  e layer. */.  if
299e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
299f0 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  e!=SQLITE_OK && 
29a00 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
29a10 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
29a20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
29a30 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
29a40 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
29a50 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
29a60 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
29a70 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29  pgno, 1, ppPage)
29a80 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
29a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29aa0 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
29ab0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
29ac0 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
29ad0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
29ae0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
29af0 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
29b00 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
29b10 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
29b20 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
29b30 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
29b40 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
29b50 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
29b60 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
29b70 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
29b80 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
29b90 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
29ba0 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
29bb0 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
29bc0 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
29bd0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
29be0 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  || (*ppPage)->pP
29bf0 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ager==0 );..  if
29c00 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
29c10 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e  ger && !noConten
29c20 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
29c30 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61  his case the pca
29c40 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  che already cont
29c50 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ains an initiali
29c60 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20  zed copy of.    
29c70 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74  ** the page. Ret
29c80 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74  urn without furt
29c90 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20  her ado.  */.   
29ca0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50   assert( pgno<=P
29cb0 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26  AGER_MAX_PGNO &&
29cc0 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f   pgno!=PAGER_MJ_
29cd0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
29ce0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
29cf0 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20  Pager->nHit);.  
29d00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29d10 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
29d20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
29d30 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
29d40 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
29d50 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
29d60 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
29d70 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20  tialized.  */.  
29d80 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20 20 20    int nMax;..   
29d90 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
29da0 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
29db0 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20  pPg = *ppPage;. 
29dc0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
29dd0 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a   pPager;..    /*
29de0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
29df0 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
29e00 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
29e10 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67  CORRUPT if a pag
29e20 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
29e30 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
29e40 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64  s, or the unused
29e50 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69   locking-page, i
29e60 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a  s requested. */.
29e70 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47      if( pgno>PAG
29e80 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
29e90 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
29ea0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
29eb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29ec0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29ed0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
29ee0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
29ef0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  }..    rc = sqli
29f00 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
29f10 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29  t(pPager, &nMax)
29f20 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
29f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29f40 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
29f50 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  ire_err;.    }..
29f60 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c      if( MEMDB ||
29f70 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20   nMax<(int)pgno 
29f80 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20  || noContent || 
29f90 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
29fa0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
29fb0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
29fc0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
29fd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
29fe0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
29ff0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
2a000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a010 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
2a020 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
2a030 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62  ure to set the b
2a040 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75  its in the InJou
2a050 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73  rnal bit-vectors
2a060 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20   is benign..    
2a070 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79      ** It merely
2a080 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d   means that we m
2a090 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74  ight do some ext
2a0a0 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e  ra work to journ
2a0b0 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  al a .        **
2a0c0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
2a0d0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
2a0e0 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
2a0f0 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
2a100 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
2a110 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68  test the case wh
2a120 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72  ere a malloc err
2a130 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2a140 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20  trying to set . 
2a150 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20         ** a bit 
2a160 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e  in a bit vector.
2a170 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2a180 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
2a190 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
2a1a0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
2a1b0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
2a1c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2a1d0 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
2a1e0 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   ) sqlite3Bitvec
2a1f0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
2a200 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
2a210 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2a220 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
2a230 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  MEM );.        }
2a240 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  .        TESTONL
2a250 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53  Y( rc = ) addToS
2a260 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
2a270 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
2a280 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2a290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
2a2a0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  M );.        sql
2a2b0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
2a2c0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  loc();.      }. 
2a2d0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
2a2e0 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
2a2f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2a300 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
2a310 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
2a320 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
2a330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
2a340 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
2a350 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
2a360 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
2a370 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
2a380 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a390 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
2a3a0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
2a3b0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
2a3c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2a3d0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
2a3e0 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
2a3f0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
2a400 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  Pg);.#endif.  }.
2a410 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2a420 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75  _OK;..pager_acqu
2a430 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72  ire_err:.  asser
2a440 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2a450 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b   );.  if( pPg ){
2a460 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
2a470 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d  heDrop(pPg);.  }
2a480 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
2a490 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
2a4a0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
2a4b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a4c0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
2a4d0 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
2a4e0 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
2a4f0 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
2a500 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
2a510 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
2a520 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
2a530 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
2a540 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
2a550 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
2a560 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75  ache. Also, retu
2a570 72 6e 20 30 20 69 66 20 74 68 65 20 0a 2a 2a 20  rn 0 if the .** 
2a580 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
2a590 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77  R_UNLOCK state w
2a5a0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2a5b0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  n is called,.** 
2a5c0 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
2a5d0 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  is in an error s
2a5e0 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
2a5f0 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a  SQLITE_FULL..**.
2a600 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2a610 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
2a620 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
2a630 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
2a640 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
2a650 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
2a660 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
2a670 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
2a680 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
2a690 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
2a6a0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
2a6b0 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
2a6c0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
2a6d0 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
2a6e0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
2a6f0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
2a700 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
2a710 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
2a720 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
2a730 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
2a740 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
2a750 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2a760 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
2a770 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2a780 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2a790 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
2a7a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
2a7b0 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73  Cache!=0 );.  as
2a7c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2a7d0 61 74 65 20 3e 20 50 41 47 45 52 5f 55 4e 4c 4f  ate > PAGER_UNLO
2a7e0 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  CK );.  sqlite3P
2a7f0 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
2a800 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
2a810 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65  , 0, &pPg);.  re
2a820 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
2a830 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
2a840 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a  e reference..**.
2a850 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
2a860 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
2a870 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
2a880 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
2a890 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
2a8a0 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
2a8b0 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
2a8c0 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
2a8d0 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
2a8e0 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
2a8f0 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
2a900 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2a910 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
2a920 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
2a930 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
2a940 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
2a950 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61  f( pPg ){.    Pa
2a960 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2a970 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73  g->pPager;.    s
2a980 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
2a990 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61  ase(pPg);.    pa
2a9a0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
2a9b0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  d(pPager);.  }.}
2a9c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2a9d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2a9e0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2a9f0 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
2aa00 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
2aa10 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
2aa20 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
2aa30 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2aa40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
2aa50 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
2aa60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2aa70 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
2aa80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2aa90 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
2aaa0 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
2aab0 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
2aac0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
2aad0 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
2aae0 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
2aaf0 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
2ab00 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
2ab10 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
2ab20 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
2ab30 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
2ab40 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
2ab50 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
2ab60 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
2ab70 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
2ab80 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
2ab90 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
2aba0 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
2abb0 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
2abc0 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
2abd0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2abe0 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
2abf0 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
2ac00 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
2ac10 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
2ac20 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
2ac30 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
2ac40 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
2ac50 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
2ac60 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
2ac70 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
2ac80 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
2ac90 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
2aca0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2acb0 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
2acc0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
2acd0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
2ace0 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
2acf0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
2ad00 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
2ad10 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
2ad20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
2ad30 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
2ad40 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
2ad50 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
2ad60 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
2ad70 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
2ad80 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
2ad90 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
2ada0 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
2adb0 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
2adc0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
2add0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
2ade0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2adf0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ae00 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2ae10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2ae20 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2ae30 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2ae60 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
2ae70 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
2ae80 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2ae90 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
2aea0 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
2aeb0 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
2aec0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
2aed0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2aee0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
2aef0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2af00 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2af10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2af20 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2af30 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2af40 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OFF );.  assert(
2af50 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2af60 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f  nal==0 );.  .  /
2af70 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20  * If already in 
2af80 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
2af90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2afa0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  s a no-op.  But 
2afb0 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65  on.  ** the othe
2afc0 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75  r hand, this rou
2afd0 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
2afe0 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61  lled if we are a
2aff0 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61  lready in.  ** a
2b000 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a  n error state. *
2b010 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
2b020 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
2b030 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2b040 65 72 72 43 6f 64 65 3b 0a 0a 20 20 74 65 73 74  errCode;..  test
2b050 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62  case( pPager->db
2b060 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  SizeValid==0 );.
2b070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2b080 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2b090 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
2b0a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2b0b0 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  rc;.  pPager->pI
2b0c0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
2b0d0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 6e  e3BitvecCreate(n
2b0e0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 50 61  Page);.  if( pPa
2b0f0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
2b100 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2b110 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b120 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
2b130 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b140 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
2b150 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69  ady open. */.  i
2b160 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
2b170 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  r->jfd) ){.    i
2b180 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2b190 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2b1a0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2b1b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2b1c0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
2b1d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2b1e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
2b1f0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b210 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2b220 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  to open journal 
2b230 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
2b240 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2b250 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
2b260 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
2b270 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46    (pPager->tempF
2b280 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20  ile ? .         
2b290 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
2b2a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
2b2b0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
2b2c0 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20  RNAL):.         
2b2d0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
2b2e0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20  IN_JOURNAL).    
2b2f0 20 20 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51      );.#ifdef SQ
2b300 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2b310 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72  IC_WRITE.      r
2b320 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
2b330 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
2b340 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
2b350 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
2b360 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72  ->jfd, flags, jr
2b370 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
2b380 67 65 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65  ger).      );.#e
2b390 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73  lse.      rc = s
2b3a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2b3b0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2b3c0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
2b3d0 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e  , flags, 0);.#en
2b3e0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  dif.    }.    as
2b3f0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2b400 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
2b410 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
2b420 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  }...  /* Write t
2b430 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
2b440 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
2b450 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
2b460 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73  open .  ** the s
2b470 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
2b480 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
2b490 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b4a0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K ){.    /* TODO
2b4b0 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f  : Check if all o
2b4c0 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c  f these are real
2b4d0 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ly required. */.
2b4e0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
2b4f0 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
2b500 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  >dbSize;.    pPa
2b510 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
2b520 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ted = 0;.    pPa
2b530 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
2b540 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
2b550 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
2b560 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
2b570 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
2b580 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
2b590 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2b5a0 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
2b5b0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
2b5c0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
2b5d0 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
2b5e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2b5f0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
2b600 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
2b610 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
2b620 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
2b630 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
2b640 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
2b650 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
2b660 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
2b670 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
2b680 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
2b690 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
2b6a0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
2b6b0 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
2b6c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2b6d0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
2b6e0 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
2b6f0 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  t is false, then
2b700 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
2b710 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  t a RESERVED.** 
2b720 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2b730 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78  base file. If ex
2b740 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
2b750 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
2b760 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53  ast.** an EXCLUS
2b770 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63  IVE lock. If suc
2b780 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  h a lock is alre
2b790 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63  ady held, no loc
2b7a0 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  king .** functio
2b7b0 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65  ns need be calle
2b7c0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  d..**.** If this
2b7d0 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
2b7e0 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ary or in-memory
2b7f0 20 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a   file and, the j
2b800 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
2b810 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20  ** opened if it 
2b820 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72  has not been alr
2b830 65 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70  eady. For a temp
2b840 6f 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20  orary file, the 
2b850 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74  opening .** of t
2b860 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b870 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
2b880 6c 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 63  l there is an ac
2b890 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a  tual need to .**
2b8a0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
2b8b0 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79  urnal. TODO: Why
2b8c0 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72   handle temporar
2b8d0 79 20 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e  y files differen
2b8e0 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  tly?.**.** If th
2b8f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b900 73 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20  s opened (or if 
2b910 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
2b920 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a  en), then a.** j
2b930 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
2b940 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2b950 73 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a  start of it..**.
2b960 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
2b970 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
2b980 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2b990 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
2b9a0 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
2b9b0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
2b9c0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
2b9d0 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
2b9e0 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
2b9f0 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
2ba00 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
2ba10 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
2ba20 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
2ba30 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
2ba40 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
2ba50 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
2ba60 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
2ba70 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
2ba80 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
2ba90 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
2baa0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
2bab0 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
2bac0 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
2bad0 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
2bae0 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
2baf0 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
2bb00 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2bb10 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
2bb20 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2bb30 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
2bb40 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
2bb50 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
2bb60 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
2bb70 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
2bb80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2bb90 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
2bba0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
2bbb0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
2bbc0 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
2bbd0 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
2bbe0 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
2bbf0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
2bc00 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
2bc10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2bc20 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2bc30 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2bc40 74 28 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50  t( !MEMDB && !pP
2bc50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2bc60 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
2bc70 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2bc80 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
2bc90 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
2bca0 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
2bcb0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
2bcc0 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
2bcd0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
2bce0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2bcf0 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
2bd00 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
2bd10 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
2bd20 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
2bd30 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2bd40 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78   && sqlite3WalEx
2bd50 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
2bd60 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
2bd70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2bd80 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
2bd90 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
2bda0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
2bdb0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2bdc0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
2bdd0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2bde0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bdf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2be00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2be10 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63     sqlite3WalExc
2be20 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
2be30 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20  r->pWal, 1);.   
2be40 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
2be50 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f  rab the write lo
2be60 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69  ck on the log fi
2be70 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
2be80 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20  l, upgrade to.  
2be90 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53      ** PAGER_RES
2bea0 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68  ERVED state. Oth
2beb0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
2bec0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
2bed0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
2bee0 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61    ** The busy-ha
2bef0 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76  ndler is not inv
2bf00 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20  oked if another 
2bf10 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61  connection alrea
2bf20 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64  dy.      ** hold
2bf30 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  s the write-lock
2bf40 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  . If possible, t
2bf50 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
2bf60 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20  ill call it..   
2bf70 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
2bf80 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67  AL mode sets Pag
2bf90 65 72 2e 73 74 61 74 65 20 74 6f 20 50 41 47 45  er.state to PAGE
2bfa0 52 5f 52 45 53 45 52 56 45 44 20 77 68 65 6e 20  R_RESERVED when 
2bfb0 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 0a 20  it has an open. 
2bfc0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
2bfd0 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74  ion, but never t
2bfe0 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
2bff0 45 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  E. This is becau
2c000 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  se in .      ** 
2c010 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2c020 73 74 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  state the code t
2c030 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
2c040 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
2c050 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ns.      ** may 
2c060 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
2c070 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
2c080 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
2c090 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 0a 20 20   file as well.  
2c0a0 20 20 20 20 2a 2a 20 61 73 20 69 6e 74 6f 20 74      ** as into t
2c0b0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57  he page cache. W
2c0c0 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e  hich would be in
2c0d0 63 6f 72 72 65 63 74 20 69 6e 20 57 41 4c 20 6d  correct in WAL m
2c0e0 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
2c0f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c100 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
2c110 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
2c120 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  >pWal);.      if
2c130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c140 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2c150 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
2c160 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
2c170 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2c180 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
2c190 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
2c1a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2c1b0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ff = 0;.      }.
2c1c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
2c1d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2c1e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
2c1f0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
2c200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
2c210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
2c220 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
2c230 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
2c240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c250 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
2c260 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
2c270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2c280 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
2c290 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a  rameter.      **
2c2a0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69   is true, then i
2c2b0 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61  mmediately upgra
2c2c0 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58  de this to an EX
2c2d0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
2c2e0 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d  e.      ** busy-
2c2f0 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
2c300 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
2c310 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74  n upgrading to t
2c320 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  he EXCLUSIVE.   
2c330 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20     ** lock, but 
2c340 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69  not when obtaini
2c350 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ng the RESERVED 
2c360 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lock..      */. 
2c370 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c380 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
2c390 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
2c3a0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
2c3b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c3c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
2c3d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
2c3e0 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69  ERVED;.        i
2c3f0 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
2c400 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2c410 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
2c420 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
2c430 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2c440 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2c450 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20  .    /* No need 
2c460 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2c470 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 69 73  nal file at this
2c480 20 74 69 6d 65 2e 20 20 49 74 20 77 69 6c 6c 20   time.  It will 
2c490 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64  be.    ** opened
2c4a0 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72   before it is wr
2c4b0 69 74 74 65 6e 20 74 6f 2e 20 20 49 66 20 77 65  itten to.  If we
2c4c0 20 64 65 66 65 72 20 6f 70 65 6e 69 6e 67 20 74   defer opening t
2c4d0 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20 20 20 20  he journal,.    
2c4e0 2a 2a 20 77 65 20 6d 69 67 68 74 20 73 61 76 65  ** we might save
2c4f0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 63 72 65   the work of cre
2c500 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69 66 20  ating a file if 
2c510 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
2c520 20 20 20 20 2a 2a 20 65 6e 64 73 20 75 70 20 62      ** ends up b
2c530 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  eing a no-op..  
2c540 20 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28    */.  }else if(
2c550 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2c560 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
2c570 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
2c580 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
2c590 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
2c5a0 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
2c5b0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
2c5c0 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a   the last.    **
2c5d0 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
2c5e0 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
2c5f0 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
2c600 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
2c610 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
2c620 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
2c630 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
2c640 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2c650 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
2c660 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68  pt open and eith
2c670 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  er was truncated
2c680 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69   to 0 bytes or i
2c690 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20  ts header was.  
2c6a0 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e    ** overwritten
2c6b0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
2c6c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2c6d0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2c6e0 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  er)==0 );.    as
2c6f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
2c700 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
2c710 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
2c720 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  rigSize==0 );.  
2c730 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2c740 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
2c750 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
2c760 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
2c770 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 50  Pager);.  }..  P
2c780 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
2c790 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
2c7a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
2c7b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2c7c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2c7d0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62  ert( !pPager->db
2c7e0 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20  Modified );.    
2c7f0 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f  /* Ignore any IO
2c800 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
2c810 72 73 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  rs within pager_
2c820 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
2c830 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 75  ). The.    ** pu
2c840 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61  rpose of this ca
2c850 6c 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74  ll is to reset t
2c860 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
2c870 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20  e of the pager. 
2c880 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d     ** sub-system
2c890 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74  . It doesn't mat
2c8a0 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ter if the journ
2c8b0 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  al-file is not p
2c8c0 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66  roperly.    ** f
2c8d0 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73  inalized at this
2c8e0 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74   point (since it
2c8f0 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
2c900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79  journal file any
2c910 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  way)..    */.   
2c920 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
2c930 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
2c940 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2c950 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
2c960 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
2c970 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
2c980 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
2c990 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
2c9a0 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
2c9b0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
2c9c0 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
2c9d0 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
2c9e0 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
2c9f0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
2ca00 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2ca10 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
2ca20 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
2ca30 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
2ca40 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
2ca50 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
2ca60 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
2ca70 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
2ca80 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
2ca90 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
2caa0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
2cab0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2cac0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
2cad0 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
2cae0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2caf0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
2cb00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2cb10 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2cb20 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  e is not called 
2cb30 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
2cb40 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2cb50 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72 74   been.  ** start
2cb60 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
2cb70 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2cb80 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
2cb90 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   );..  /* If an 
2cba0 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
2cbb0 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74  reviously detect
2cbc0 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73  ed, report the s
2cbd0 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61  ame error.  ** a
2cbe0 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
2cbf0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2cc00 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75 72  rrCode) )  retur
2cc10 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
2cc20 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d  e;..  /* Higher-
2cc30 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e  level routines n
2cc40 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66  ever call this f
2cc50 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62  unction if datab
2cc60 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ase is not.  ** 
2cc70 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63  writable.  But c
2cc80 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73  heck anyway, jus
2cc90 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  t for robustness
2cca0 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
2ccb0 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c  (pPager->readOnl
2ccc0 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  y) ) return SQLI
2ccd0 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61 73 73 65  TE_PERM;..  asse
2cce0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
2ccf0 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
2cd00 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
2cd10 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
2cd20 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
2cd30 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
2cd40 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
2cd50 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
2cd60 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
2cd70 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
2cd80 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  way..  */.  sqli
2cd90 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
2cda0 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  ty(pPg);.  if( p
2cdb0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
2cdc0 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72  ) && !subjRequir
2cdd0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
2cde0 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
2cdf0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2ce00 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2ce10 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
2ce20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
2ce30 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
2ce40 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
2ce50 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
2ce60 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
2ce70 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
2ce80 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
2ce90 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
2cea0 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
2ceb0 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
2cec0 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68 65 72 20  *.    ** Higher 
2ced0 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 73  level routines s
2cee0 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
2cef0 64 79 20 73 74 61 72 74 65 64 20 61 20 74 72 61  dy started a tra
2cf00 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a  nsaction,.    **
2cf10 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65   which means the
2cf20 79 20 68 61 76 65 20 61 63 71 75 69 72 65 64 20  y have acquired 
2cf30 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  the necessary lo
2cf40 63 6b 73 20 62 75 74 20 74 68 65 20 72 6f 6c 6c  cks but the roll
2cf50 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  back.    ** jour
2cf60 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65  nal might not ye
2cf70 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a  t be open..    *
2cf80 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2cf90 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 61  e3PagerBegin(pPa
2cfa0 67 65 72 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ger, 0, pPager->
2cfb0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20  subjInMemory);. 
2cfc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cfd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2cfe0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2cff0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
2d000 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 0a 20 20 20  InJournal==0.   
2d010 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
2d020 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
2d030 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2d040 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 72 55  .     && !pagerU
2d050 73 65 57 61 6c 28 70 50 61 67 65 72 29 0a 20 20  seWal(pPager).  
2d060 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
2d070 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2d080 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 72  urnal );.      r
2d090 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
2d0a0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2d0b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d0c0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
2d0d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
2d0e0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2d0f0 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  d = 1;.  .    /*
2d100 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
2d110 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
2d120 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
2d130 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
2d140 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
2d150 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
2d160 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2d170 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
2d180 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
2d190 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
2d1a0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
2d1b0 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
2d1c0 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
2d1d0 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f     if( !pageInJo
2d1e0 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69 73  urnal(pPg) && is
2d1f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2d200 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
2d210 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
2d220 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
2d230 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
2d240 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2d250 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33  ze ){.        u3
2d260 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20  2 cksum;.       
2d270 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a   char *pData2;..
2d280 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
2d290 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
2d2a0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2d2b0 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
2d2c0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
2d2d0 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
2d2e0 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
2d2f0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
2d300 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
2d310 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
2d320 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
2d330 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
2d340 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
2d350 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
2d360 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2d370 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
2d380 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
2d390 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20  alOff );.       
2d3a0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
2d3b0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
2d3c0 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
2d3d0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
2d3e0 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
2d3f0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
2d400 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
2d410 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  a2);.        rc 
2d420 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
2d430 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
2d440 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
2d450 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
2d460 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d480 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2d490 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
2d4a0 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
2d4b0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
2d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4d0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
2d4e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20  r->journalOff + 
2d4f0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  4);.          pP
2d500 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2d510 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
2d520 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20  Size+4;.        
2d530 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
2d540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d550 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
2d560 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
2d570 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
2d580 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d  ournalOff, cksum
2d590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
2d5a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
2d5b0 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
2d5c0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
2d5d0 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
2d5e0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
2d5f0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
2d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
2d610 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2d620 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2d630 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
2d640 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
2d650 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
2d660 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
2d670 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
2d680 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
2d690 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
2d6a0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
2d6b0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
2d6c0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2d6d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2d6e0 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
2d6f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
2d700 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
2d710 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20  sh(pPg)));..    
2d720 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61      /* Even if a
2d730 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
2d740 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2d750 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  while journallin
2d760 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  g the.        **
2d770 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f   page in the blo
2d780 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68  ck above, set th
2d790 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67  e need-sync flag
2d7a0 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20   for the page.. 
2d7b0 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
2d7c0 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
2d7d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
2d7e0 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
2d7f0 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  gic in.        *
2d800 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
2d810 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
2d820 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
2d830 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
2d840 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
2d850 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2d860 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
2d870 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2d880 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
2d890 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63         ** then c
2d8a0 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
2d8b0 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  llow..        */
2d8c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
2d8d0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
2d8e0 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
2d8f0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
2d900 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
2d910 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
2d920 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
2d930 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
2d940 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
2d950 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  rred writing to 
2d960 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d970 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
2d980 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
2d990 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
2d9a0 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
2d9b0 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
2d9c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2d9d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d9e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2d9f0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
2da00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
2da10 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
2da20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
2da30 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
2da40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2da50 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
2da60 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
2da70 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
2da80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
2da90 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
2daa0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2dab0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2dac0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
2dad0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
2dae0 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
2daf0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
2db00 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
2db10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2db20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2db30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
2db40 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
2db50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
2db60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2db70 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2db80 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2db90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
2dba0 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
2dbb0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
2dbc0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
2dbd0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2dbe0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2dbf0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
2dc00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2dc10 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2dc20 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
2dc30 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
2dc40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2dc50 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
2dc60 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
2dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
2dc80 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2dc90 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
2dca0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2dcb0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
2dcc0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
2dcd0 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
2dce0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2dcf0 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
2dd00 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
2dd10 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
2dd20 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
2dd30 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
2dd40 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
2dd50 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
2dd60 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
2dd70 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
2dd80 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
2dd90 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
2dda0 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
2ddb0 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
2ddc0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
2ddd0 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
2dde0 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20  ge(pPg) ){.     
2ddf0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
2de00 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
2de10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
2de20 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
2de30 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
2de40 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2de50 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2de60 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
2de70 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
2de80 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  ze<pPg->pgno ){.
2de90 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
2dea0 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
2deb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2dec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
2ded0 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
2dee0 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f  iteable. This ro
2def0 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
2df00 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20  lled before .** 
2df10 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74  making changes t
2df20 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61  o a page. The ca
2df30 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20  ller must check 
2df40 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
2df50 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e   .** of this fun
2df60 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72  ction and be car
2df70 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e  eful not to chan
2df80 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
2df90 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73   unless .** this
2dfa0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2dfb0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
2dfc0 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
2dfd0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
2dfe0 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
2dff0 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
2e000 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
2e010 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
2e020 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
2e030 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
2e040 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
2e050 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
2e060 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
2e070 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
2e080 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
2e090 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
2e0a0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
2e0b0 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
2e0c0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
2e0d0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2e0e0 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  curs, SQLITE_NOM
2e0f0 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  EM or an IO erro
2e100 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2e110 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72  ed.** as appropr
2e120 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  iate. Otherwise,
2e130 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
2e140 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
2e150 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
2e160 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
2e170 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2e180 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
2e190 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
2e1a0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2e1b0 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
2e1c0 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
2e1d0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2e1e0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
2e1f0 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65  e);..  if( nPage
2e200 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
2e210 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
2e220 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
2e230 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2e240 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
2e250 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
2e260 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
2e270 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2e280 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
2e290 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
2e2a0 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
2e2b0 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
2e2c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e2d0 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
2e2e0 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
2e2f0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
2e300 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
2e310 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2e320 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
2e330 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  t needSync = 0; 
2e340 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e350 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20  if any page has 
2e360 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2e370 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  */..    /* Set t
2e380 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  he doNotSyncSpil
2e390 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  l flag to 1. Thi
2e3a0 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
2e3b0 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20  cannot allow.   
2e3c0 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65   ** a journal he
2e3d0 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
2e3e0 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
2e3f0 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
2e400 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75  y.    ** this fu
2e410 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
2e420 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
2e430 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
2e440 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
2e450 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ncSpill==0 );.  
2e460 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
2e470 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20  yncSpill++;..   
2e480 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
2e490 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
2e4a0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
2e4b0 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
2e4c0 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
2e4d0 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
2e4e0 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
2e4f0 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
2e500 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
2e510 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
2e520 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
2e530 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
2e540 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
2e550 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
2e560 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
2e570 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
2e580 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e590 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
2e5a0 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50  ager, (int *)&nP
2e5b0 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69  ageCount);.    i
2e5c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e5d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
2e5e0 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
2e5f0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50  nt ){.        nP
2e600 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  age = (pPg->pgno
2e610 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 20   - pg1)+1;.     
2e620 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b   }else if( (pg1+
2e630 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
2e640 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  )>nPageCount ){.
2e650 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20          nPage = 
2e660 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
2e670 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e680 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e         nPage = n
2e690 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20  PagePerSector;. 
2e6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2e6b0 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
2e6c0 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
2e6d0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2e6e0 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50    assert((pg1+nP
2e6f0 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b  age)>pPg->pgno);
2e700 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
2e710 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
2e720 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
2e730 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
2e740 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
2e750 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
2e760 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
2e770 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
2e780 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
2e790 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
2e7a0 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
2e7b0 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
2e7c0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
2e7d0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
2e7e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2e7f0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
2e800 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
2e810 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e820 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e830 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2e840 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
2e850 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
2e860 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
2e870 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
2e880 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64              need
2e890 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
2e8a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
2e8b0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29  Pager->needSync)
2e8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2e8d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e8e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2e8f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2e900 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e910 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
2e920 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
2e930 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
2e940 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
2e950 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
2e960 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
2e970 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
2e980 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
2e990 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
2e9a0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
2e9b0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
2e9c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2e9d0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
2e9e0 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  C flag is set fo
2e9f0 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61  r any of the nPa
2ea00 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
2ea10 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
2ea20 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20  , then it needs 
2ea30 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c  to be set for al
2ea40 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75  l of them. Becau
2ea50 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e  se.    ** writin
2ea60 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73  g to any of thes
2ea70 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61  e nPage pages ma
2ea80 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68  y damage the oth
2ea90 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ers, the.    ** 
2eaa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
2eab0 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29  t contain sync()
2eac0 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c  ed copies of all
2ead0 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
2eae0 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68  before any of th
2eaf0 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  em can be writte
2eb00 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
2eb10 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
2eb20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2eb30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64  QLITE_OK && need
2eb40 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
2eb50 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20  sert( !MEMDB && 
2eb60 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d  pPager->noSync==
2eb70 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
2eb80 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69  i=0; ii<nPage; i
2eb90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
2eba0 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
2ebb0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
2ebc0 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
2ebd0 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a     if( pPage ){.
2ebe0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
2ebf0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
2ec00 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
2ec10 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2ec20 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
2ec30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ec40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
2ec50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
2ec60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
2ec70 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
2ec80 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b  tSyncSpill==1 );
2ec90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
2eca0 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20  otSyncSpill--;. 
2ecb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2ecc0 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62   pager_write(pDb
2ecd0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
2ece0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ecf0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2ed00 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
2ed10 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
2ed20 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
2ed30 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
2ed40 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20  e3PagerWrite(). 
2ed50 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2ed60 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
2ed70 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
2ed80 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
2ed90 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
2eda0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
2edb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2edc0 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50  rIswriteable(DbP
2edd0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
2ede0 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  urn pPg->flags&P
2edf0 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65  GHDR_DIRTY;.}.#e
2ee00 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
2ee10 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
2ee20 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
2ee30 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
2ee40 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
2ee50 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
2ee60 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
2ee70 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
2ee80 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
2ee90 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
2eea0 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
2eeb0 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68  s dirty.  This h
2eec0 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
2eed0 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ple, when.** the
2eee0 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61   page has been a
2eef0 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f  dded as a leaf o
2ef00 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
2ef10 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e  nd so its.** con
2ef20 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d  tent no longer m
2ef30 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atters..**.** Th
2ef40 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
2ef50 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
2ef60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
2ef70 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
2ef80 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
2ef90 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
2efa0 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  d. The pager mar
2efb0 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
2efc0 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
2efd0 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
2efe0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2eff0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
2f000 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
2f010 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61  mization can qua
2f020 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
2f030 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45   of large .** DE
2f040 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  LETE operations.
2f050 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2f060 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50  PagerDontWrite(P
2f070 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
2f080 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2f090 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
2f0a0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
2f0b0 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61  DR_DIRTY) && pPa
2f0c0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
2f0d0 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  =0 ){.    PAGERT
2f0e0 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54  RACE(("DONT_WRIT
2f0f0 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
2f100 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
2f110 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
2f120 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
2f130 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
2f140 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2f150 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61  o)).    pPg->fla
2f160 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54  gs |= PGHDR_DONT
2f170 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53  _WRITE;.#ifdef S
2f180 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
2f190 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
2f1a0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
2f1b0 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
2f1c0 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  f.  }.}../*.** T
2f1d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2f1e0 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
2f1f0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nt the value of 
2f200 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f210 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75  e .** change-cou
2f220 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  nter, stored as 
2f230 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 4-byte big-end
2f240 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72  ian integer star
2f250 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65  ting at .** byte
2f260 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68   offset 24 of th
2f270 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a  e pager file..**
2f280 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72  .** If the isDir
2f290 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73 20  ectMode flag is 
2f2a0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
2f2b0 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69  is done by calli
2f2c0 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
2f2d0 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61  gerWrite() on pa
2f2e0 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66  ge 1, then modif
2f2f0 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
2f300 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  s of the.** page
2f310 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63   data. In this c
2f320 61 73 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c  ase the file wil
2f330 6c 20 62 65 20 75 70 64 61 74 65 64 20 77 68 65  l be updated whe
2f340 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
2f350 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2f360 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
2f370 20 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   The isDirectMod
2f380 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20  e flag may only 
2f390 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  be non-zero if t
2f3a0 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63  he library was c
2f3b0 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20  ompiled.** with 
2f3c0 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
2f3d0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d  E_ATOMIC_WRITE m
2f3e0 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e  acro defined. In
2f3f0 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
2f400 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f  f isDirect is no
2f410 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
2f420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2f430 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63 74  s updated direct
2f440 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67  ly.** by writing
2f450 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72 73   an updated vers
2f460 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73  ion of page 1 us
2f470 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68  ing a call to th
2f480 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57  e .** sqlite3OsW
2f490 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rite() function.
2f4a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2f4b0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2f4c0 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
2f4d0 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72  Pager, int isDir
2f4e0 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ectMode){.  int 
2f4f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2f500 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e  .  /* Declare an
2f510 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e  d initialize con
2f520 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69  stant integer 'i
2f530 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65  sDirect'. If the
2f540 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69  .  ** atomic-wri
2f550 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2f560 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68  is enabled in th
2f570 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69  is build, then i
2f580 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20  sDirect.  ** is 
2f590 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
2f5a0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
2f5b0 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d  as the isDirectM
2f5c0 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20  ode parameter.  
2f5d0 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
2f5e0 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
2f5f0 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  it is always set
2f600 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20   to zero..  **. 
2f610 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20   ** The idea is 
2f620 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d  that if the atom
2f630 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2f640 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a  ation is not.  *
2f650 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  * enabled at com
2f660 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63  pile time, the c
2f670 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74  ompiler can omit
2f680 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20   the tests of.  
2f690 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65  ** 'isDirect' be
2f6a0 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20  low, as well as 
2f6b0 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73  the block enclos
2f6c0 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22  ed in the.  ** "
2f6d0 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20  if( isDirect )" 
2f6e0 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  condition..  */.
2f6f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
2f700 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2f710 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45  TE.# define DIRE
2f720 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65  CT_MODE 0.  asse
2f730 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65  rt( isDirectMode
2f740 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==0 );.  UNUSED_
2f750 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72 65  PARAMETER(isDire
2f760 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23  ctMode);.#else.#
2f770 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d   define DIRECT_M
2f780 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65  ODE isDirectMode
2f790 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
2f7a0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2f7b0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
2f7c0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2f7d0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2f7e0 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  ne && pPager->db
2f7f0 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67  Size>0 ){.    Pg
2f800 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20  Hdr *pPgHdr;    
2f810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2f820 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
2f830 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68   1 */.    u32 ch
2f840 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20  ange_counter;   
2f850 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
2f860 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e  al value of chan
2f870 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
2f880 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
2f890 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
2f8a0 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  le && isOpen(pPa
2f8b0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20  ger->fd) );..   
2f8c0 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
2f8d0 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
2f8e0 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
2f8f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f900 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
2f910 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73  &pPgHdr);.    as
2f920 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20  sert( pPgHdr==0 
2f930 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
2f940 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
2f950 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63  age one was fetc
2f960 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  hed successfully
2f970 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
2f980 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  ion is not.    *
2f990 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64  * operating in d
2f9a0 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65  irect-mode, make
2f9b0 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65   page 1 writable
2f9c0 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a  .  When not in .
2f9d0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f      ** direct mo
2f9e0 64 65 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c  de, page 1 is al
2f9f0 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63  ways held in cac
2fa00 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65  he and hence the
2fa10 20 50 61 67 65 72 47 65 74 28 29 0a 20 20 20 20   PagerGet().    
2fa20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61  ** above is alwa
2fa30 79 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20  ys successful - 
2fa40 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53  hence the ALWAYS
2fa50 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   on rc==SQLITE_O
2fa60 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  K..    */.    if
2fa70 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26  ( !DIRECT_MODE &
2fa80 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c  & ALWAYS(rc==SQL
2fa90 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  ITE_OK) ){.     
2faa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2fab0 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
2fac0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2fad0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fae0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  .      /* Increm
2faf0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
2fb00 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
2fb10 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
2fb20 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63  e 24. */.      c
2fb30 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
2fb40 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
2fb50 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46  (u8*)pPager->dbF
2fb60 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20 20  ileVers);.      
2fb70 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
2fb80 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74  ;.      put32bit
2fb90 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72  s(((char*)pPgHdr
2fba0 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61  ->pData)+24, cha
2fbb0 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20  nge_counter);.. 
2fbc0 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f       /* Also sto
2fbd0 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
2fbe0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
2fbf0 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
2fc00 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 74   in.      ** byt
2fc10 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20  es 92..95 store 
2fc20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
2fc30 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
2fc40 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a   version number.
2fc50 20 20 20 20 20 20 2a 2a 20 69 73 20 76 61 6c 69        ** is vali
2fc60 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 75 74 33  d. */.      put3
2fc70 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
2fc80 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 32 2c  gHdr->pData)+92,
2fc90 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
2fca0 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74  ;.      put32bit
2fcb0 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72  s(((char*)pPgHdr
2fcc0 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c  ->pData)+96, SQL
2fcd0 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
2fce0 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ER);..      /* I
2fcf0 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72  f running in dir
2fd00 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  ect mode, write 
2fd10 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2fd20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20 66 69  page 1 to the fi
2fd30 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  le. */.      if(
2fd40 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a   DIRECT_MODE ){.
2fd50 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f          const vo
2fd60 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20 20 20  id *zBuf;.      
2fd70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2fd80 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29  ->dbFileSize>0 )
2fd90 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32  ;.        CODEC2
2fda0 28 70 50 61 67 65 72 2c 20 70 50 67 48 64 72 2d  (pPager, pPgHdr-
2fdb0 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c 20 72 63  >pData, 1, 6, rc
2fdc0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a  =SQLITE_NOMEM, z
2fdd0 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Buf);.        if
2fde0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fdf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2fe00 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2fe10 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
2fe20 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
2fe30 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ize, 0);.       
2fe40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
2fe50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fe60 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2fe70 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2fe80 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  e = 1;.        }
2fe90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2fea0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68        pPager->ch
2feb0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2fec0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2fed0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
2fee0 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
2fef0 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
2ff00 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2ff10 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  gHdr);.  }.  ret
2ff20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ff30 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20   Sync the pager 
2ff40 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68  file to disk. Th
2ff50 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  is is a no-op fo
2ff60 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  r in-memory file
2ff70 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69  s.** or pages wi
2ff80 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  th the Pager.noS
2ff90 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ync flag set..**
2ffa0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2ffb0 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20  l, or called on 
2ffc0 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  a pager for whic
2ffd0 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c  h it is a no-op,
2ffe0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
2fff0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
30000 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
30010 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
30020 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
30030 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
30040 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  rSync(Pager *pPa
30050 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
30060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30080 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
30090 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
300a0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
300b0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
300c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
300d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
300e0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
300f0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
30100 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
30110 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
30120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
30130 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30140 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
30150 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
30160 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
30170 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
30180 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
30190 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
301a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
301b0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
301c0 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
301d0 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
301e0 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
301f0 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
30200 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
30210 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
30220 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
30230 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
30240 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a  ensures that:.**
30250 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
30260 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
30270 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61  -counter is upda
30280 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20  ted,.**   * the 
30290 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
302a0 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74  d (unless the at
302b0 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
302c0 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29  ization is used)
302d0 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72  ,.**   * all dir
302e0 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69  ty pages are wri
302f0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
30300 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20  base file, .**  
30310 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
30320 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
30330 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c  d (if required),
30340 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20   and.**   * the 
30350 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
30360 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  nced. .**.** The
30370 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
30380 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
30390 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
303a0 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a  on is to finaliz
303b0 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74  e .** (delete, t
303c0 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
303d0 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f  the first part o
303e0 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  f) the journal f
303f0 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65  ile (or .** dele
30400 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
30410 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
30420 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
30430 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
30440 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
30450 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
30460 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
30470 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
30480 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
30490 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
304a0 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
304b0 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   the final param
304c0 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20  eter - noSync - 
304d0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
304e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
304f0 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74  itself.** is not
30500 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c   synced. The cal
30510 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71  ler must call sq
30520 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29  lite3PagerSync()
30530 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
30540 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
30550 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  e file before ca
30560 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73  lling CommitPhas
30570 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65  eTwo() to delete
30580 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
30590 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
305a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
305b0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
305c0 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70  eOne(.  Pager *p
305d0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
305e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
305f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
30600 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
30610 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30620 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
30630 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
30640 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  name */.  int no
30650 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
30660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30670 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53  e to omit the xS
30680 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ync on the db fi
30690 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
306a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
306b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
306c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
306d0 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a  /* The dbOrigSiz
306e0 65 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 69  e is never set i
306f0 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f  f journal_mode=O
30700 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  FF */.  assert( 
30710 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
30720 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
30730 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 50  ALMODE_OFF || pP
30740 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
30750 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
30760 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63  a prior error oc
30770 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74  curred, report t
30780 68 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e  hat error again.
30790 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
307a0 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
307b0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
307c0 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  de;..  PAGERTRAC
307d0 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e  E(("DATABASE SYN
307e0 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74  C: File=%s zMast
307f0 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e  er=%s nSize=%d\n
30800 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  ", .      pPager
30810 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61  ->zFilename, zMa
30820 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62  ster, pPager->db
30830 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28 20 4d  Size));..  if( M
30840 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
30850 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20  dbModified ){.  
30860 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
30870 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
30880 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
30890 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
308a0 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a  o, or this.    *
308b0 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
308c0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
308d0 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79  ed, it is mostly
308e0 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76   a no-op.  Howev
308f0 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62  er, any.    ** b
30900 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73  ackup in progres
30910 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
30920 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  started..    */.
30930 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
30940 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
30950 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c  >pBackup);.  }el
30960 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
30970 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
30980 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  ED && pPager->db
30990 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20 20  Modified ){.    
309a0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
309b0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
309c0 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20   PgHdr *pList = 
309d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
309e0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
309f0 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 69  PCache);.      i
30a00 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
30a10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
30a20 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
30a30 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e 64  pList, pPager->d
30a40 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20 20 20  bSize, 1, .     
30a50 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
30a60 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61 67 65  fullSync ? pPage
30a70 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3a 20  r->sync_flags : 
30a80 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
30a90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30aa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30ac0 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
30ad0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
30ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
30af0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  se{.      /* The
30b00 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
30b10 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
30b20 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61  nge-counter. Exa
30b30 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20  ctly how it.    
30b40 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64    ** does this d
30b50 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
30b60 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
30b70 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d  mic-update optim
30b80 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ization.      **
30b90 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20   was enabled at 
30ba0 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e  compile time, an
30bb0 64 20 69 66 20 74 68 69 73 20 74 72 61 6e 73 61  d if this transa
30bc0 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20  ction meets the 
30bd0 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d  .      ** runtim
30be0 65 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73  e criteria to us
30bf0 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a  e the operation:
30c00 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
30c10 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c   **    * The fil
30c20 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
30c30 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
30c40 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a  te property for.
30c50 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c        **      bl
30c60 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67  ocks of size pag
30c70 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20  e-size, and .   
30c80 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20     **    * This 
30c90 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61  commit is not pa
30ca0 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
30cb0 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  le transaction, 
30cc0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  and.      **    
30cd0 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  * Exactly one pa
30ce0 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ge has been modi
30cf0 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69  fied and store i
30d00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
30d10 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
30d20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
30d30 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f  imization was no
30d40 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  t enabled at com
30d50 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20  pile time, then 
30d60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  the.      ** pag
30d70 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
30d80 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  unter() function
30d90 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70   is called to up
30da0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a  date the change.
30db0 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72        ** counter
30dc0 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f   in 'indirect-mo
30dd0 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69  de'. If the opti
30de0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  mization is comp
30df0 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20  iled in but.    
30e00 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c    ** is not appl
30e10 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74  icable to this t
30e20 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c  ransaction, call
30e30 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
30e40 72 65 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a  reate().      **
30e50 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
30e60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
30e70 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e  as actually been
30e80 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
30e90 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  all.      ** pag
30ea0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
30eb0 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74  unter() to updat
30ec0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
30ed0 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74  nter in indirect
30ee0 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  .      ** mode. 
30ef0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
30f00 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
30f10 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
30f20 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65  n is both enable
30f30 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65  d and applicable
30f40 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
30f50 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f  call pager_incr_
30f60 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
30f70 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
30f80 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20  ange-counter.   
30f90 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74     ** in 'direct
30fa0 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20  ' mode. In this 
30fb0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
30fc0 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72   file will never
30fd0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 63 72 65   be.      ** cre
30fe0 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72  ated for this tr
30ff0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
31000 20 2a 2f 0a 20 20 23 69 66 64 65 66 20 53 51 4c   */.  #ifdef SQL
31010 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
31020 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 50 67  C_WRITE.      Pg
31030 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
31040 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
31050 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
31060 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
31070 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
31080 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20  LMODE_OFF );.   
31090 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
310a0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
310b0 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 26  ->jfd) .       &
310c0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
310d0 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72  lOff==jrnlBuffer
310e0 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20  Size(pPager) .  
310f0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
31100 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e  dbSize>=pPager->
31110 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20  dbFileSize.     
31120 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20    && (0==(pPg = 
31130 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
31140 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
31150 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70  PCache)) || 0==p
31160 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20  Pg->pDirty).    
31170 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
31180 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69  Update the db fi
31190 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  le change counte
311a0 72 20 76 69 61 20 74 68 65 20 64 69 72 65 63 74  r via the direct
311b0 2d 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54  -write method. T
311c0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  he .        ** f
311d0 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69  ollowing call wi
311e0 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65 20 69 6e  ll modify the in
311f0 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
31200 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  tation of page 1
31210 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
31220 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61  include the upda
31230 74 65 64 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ted change count
31240 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74  er and then writ
31250 65 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  e page 1 .      
31260 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
31270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31280 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74  le. Because of t
31290 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
312a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 70  .        ** prop
312b0 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74  erty of the host
312c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
312d0 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
312e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
312f0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
31300 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
31310 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ger, 1);.      }
31320 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
31330 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
31340 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  lCreate(pPager->
31350 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jfd);.        if
31360 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
31380 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
31390 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
313a0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  r, 0);.        }
313b0 0a 20 20 20 20 20 20 7d 0a 20 20 23 65 6c 73 65  .      }.  #else
313c0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
313d0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
313e0 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b  nter(pPager, 0);
313f0 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20  .  #endif.      
31400 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31410 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
31420 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
31430 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74    .      /* If t
31440 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
31450 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74  has made the dat
31460 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74  abase smaller, t
31470 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20  hen all pages.  
31480 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
31490 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
314a0 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
314b0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
314c0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
314d0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20   file. This can 
314e0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61  only happen in a
314f0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e  uto-vacuum mode.
31500 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
31510 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e  ** Before readin
31520 67 20 74 68 65 20 70 61 67 65 73 20 77 69 74 68  g the pages with
31530 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61   page numbers la
31540 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
31550 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
31560 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
31570 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a  bSize, set dbSiz
31580 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
31590 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  lue.      ** tha
315a0 74 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65  t it took at the
315b0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
315c0 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72  ansaction. Other
315d0 77 69 73 65 2c 20 74 68 65 0a 20 20 20 20 20 20  wise, the.      
315e0 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
315f0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 72 65  te3PagerGet() re
31600 74 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67 65  turn zeroed page
31610 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 20 20  s instead of .  
31620 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 64      ** reading d
31630 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
31640 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
31650 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 68    **.      ** Wh
31660 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  en journal_mode=
31670 3d 4f 46 46 20 74 68 65 20 64 62 4f 72 69 67 53  =OFF the dbOrigS
31680 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 7a 65  ize is always ze
31690 72 6f 2c 20 73 6f 20 74 68 69 73 0a 20 20 20 20  ro, so this.    
316a0 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76 65 72    ** block never
316b0 20 72 75 6e 73 20 69 66 20 6a 6f 75 72 6e 61 6c   runs if journal
316c0 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20 20 20 20  _mode=OFF..     
316d0 20 2a 2f 0a 20 20 23 69 66 6e 64 65 66 20 53 51   */.  #ifndef SQ
316e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
316f0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
31700 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
31710 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
31720 20 0a 20 20 20 20 20 20 20 26 26 20 41 4c 57 41   .       && ALWA
31730 59 53 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  YS(pPager->journ
31740 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
31750 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20  URNALMODE_OFF). 
31760 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
31770 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20 20  Pgno i;         
31780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
317a0 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
317b0 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
317c0 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47  Pgno iSkip = PAG
317d0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
317e0 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c  r); /* Pending l
317f0 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ock page */.    
31800 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64      const Pgno d
31810 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
31820 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a  dbSize;       /*
31830 20 44 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   Database image 
31840 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 20  size */ .       
31850 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
31860 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
31870 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  Size;.        fo
31880 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69  r( i=dbSize+1; i
31890 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
318a0 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
318b0 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
318c0 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
318d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
318e0 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70  , i) && i!=iSkip
318f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31900 50 67 48 64 72 20 2a 70 50 61 67 65 3b 20 20 20  PgHdr *pPage;   
31910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
31920 65 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e to journal */.
31930 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31940 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
31950 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61  (pPager, i, &pPa
31960 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
31970 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31980 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
31990 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
319a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
319b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
319c0 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
319d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
319e0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
319f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
31a00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31a10 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
31a20 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
31a30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31a40 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
31a50 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53  er->dbSize = dbS
31a60 69 7a 65 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20  ize;.      } .  
31a70 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 20 20  #endif.  .      
31a80 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
31a90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
31aa0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
31ab0 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73  l file. If a mas
31ac0 74 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ter .      ** jo
31ad0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
31ae0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
31af0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
31b00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20  journal file, . 
31b10 20 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d       ** or if zM
31b20 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e  aster is NULL (n
31b30 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
31b40 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  ), then this cal
31b50 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
31b60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
31b70 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  = writeMasterJou
31b80 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
31b90 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
31ba0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31bb0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31bc0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a  se_one_exit;.  .
31bd0 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68        /* Sync th
31be0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
31bf0 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70  If the atomic-up
31c00 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  date optimizatio
31c10 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20  n is being.     
31c20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69 73 20 63   ** used, this c
31c30 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65  all will not cre
31c40 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
31c50 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20  file or perform 
31c60 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  any.      ** rea
31c70 6c 20 49 4f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  l IO..      */. 
31c80 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
31c90 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
31ca0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31cb0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
31cc0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
31cd0 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  xit;.  .      /*
31ce0 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
31cf0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
31d00 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
31d10 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
31d20 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
31d30 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
31d40 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
31d50 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20 20 20  PCache));.      
31d60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31d70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
31d80 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
31d90 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
31da0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f  .        goto co
31db0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
31dc0 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
31dd0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
31de0 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
31df0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 0a 20 20  >pPCache);.  .  
31e00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
31e10 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f  le on disk is no
31e20 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  t the same size 
31e30 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
31e40 69 6d 61 67 65 2c 0a 20 20 20 20 20 20 2a 2a 20  image,.      ** 
31e50 74 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74  then use pager_t
31e60 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20  runcate to grow 
31e70 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69  or shrink the fi
31e80 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a  le here..      *
31e90 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
31ea0 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61 67  er->dbSize!=pPag
31eb0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
31ec0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e  {.        Pgno n
31ed0 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  New = pPager->db
31ee0 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e  Size - (pPager->
31ef0 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a  dbSize==PAGER_MJ
31f00 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
31f10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31f20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
31f30 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
31f40 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
31f50 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
31f60 61 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  ager, nNew);.   
31f70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31f80 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
31f90 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
31fa0 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  xit;.      }.  .
31fb0 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79        /* Finally
31fc0 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
31fd0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
31fe0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
31ff0 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e  noSync && !noSyn
32000 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  c ){.        rc 
32010 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
32020 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
32030 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
32040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49  .      }.      I
32050 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
32060 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
32070 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
32080 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
32090 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f  _SYNCED;.  }..co
320a0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
320b0 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  xit:.  return rc
320c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ;.}.../*.** When
320d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
320e0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61  s called, the da
320f0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
32100 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  been completely.
32110 2a 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72 65  ** updated to re
32120 66 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67 65  flect the change
32130 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 63 75  s made by the cu
32140 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
32150 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20  n and.** synced 
32160 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75  to disk. The jou
32170 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20  rnal file still 
32180 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
32190 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68  le-system .** th
321a0 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66  ough, and if a f
321b0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74  ailure occurs at
321c0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77   this point it w
321d0 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a  ill eventually.*
321e0 2a 20 62 65 20 75 73 65 64 20 61 73 20 61 20 68  * be used as a h
321f0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  ot-journal and t
32200 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
32210 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61  action rolled ba
32220 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
32230 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65  unction finalize
32240 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
32250 6c 65 2c 20 65 69 74 68 65 72 20 62 79 20 64 65  le, either by de
32260 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e  leting, .** trun
32270 63 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61  cating or partia
32280 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20  lly zeroing it, 
32290 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f  so that it canno
322a0 74 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f  t be used .** fo
322b0 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  r hot-journal ro
322c0 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69  llback. Once thi
322d0 73 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72  s is done the tr
322e0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20  ansaction is.** 
322f0 69 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d  irrevocably comm
32300 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  itted..**.** If 
32310 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
32320 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
32330 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
32340 64 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d  d the pager.** m
32350 6f 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72  oves into the er
32360 72 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ror state. Other
32370 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
32380 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
32390 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
323a0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50  CommitPhaseTwo(P
323b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
323c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
323d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
323e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
323f0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
32400 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
32410 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
32420 69 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  if a prior error
32430 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 20   has occurred.. 
32440 20 2a 2a 20 42 75 74 20 69 66 20 28 64 75 65 20   ** But if (due 
32450 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
32460 72 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20 74  r elsewhere in t
32470 68 65 20 73 79 73 74 65 6d 29 20 69 74 20 64 6f  he system) it do
32480 65 73 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c 6c  es get.  ** call
32490 65 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  ed, just return 
324a0 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63  the same error c
324b0 6f 64 65 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  ode without doin
324c0 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a 20  g anything. */. 
324d0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
324e0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
324f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
32500 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Code;..  /* This
32510 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
32520 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69   not be called i
32530 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  f the pager is n
32540 6f 74 20 69 6e 20 61 74 20 6c 65 61 73 74 0a 20  ot in at least. 
32550 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56   ** PAGER_RESERV
32560 45 44 20 73 74 61 74 65 2e 20 41 6e 64 20 69 6e  ED state. And in
32570 64 65 65 64 20 53 51 4c 69 74 65 20 6e 65 76 65  deed SQLite neve
32580 72 20 64 6f 65 73 20 74 68 69 73 2e 20 42 75 74  r does this. But
32590 20 69 74 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65   it is.  ** nice
325a0 20 74 6f 20 68 61 76 65 20 74 68 69 73 20 64 65   to have this de
325b0 66 65 6e 73 69 76 65 20 74 65 73 74 20 68 65 72  fensive test her
325c0 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20  e anyway..  */. 
325d0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
325e0 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
325f0 45 53 45 52 56 45 44 29 20 29 20 72 65 74 75 72  ESERVED) ) retur
32600 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
32610 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a  .  /* An optimiz
32620 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61  ation. If the da
32630 74 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61  tabase was not a
32640 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64  ctually modified
32650 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69   during.  ** thi
32660 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  s transaction, t
32670 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
32680 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
32690 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a  -mode and is.  *
326a0 2a 20 75 73 69 6e 67 20 70 65 72 73 69 73 74 65  * using persiste
326b0 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  nt journals, the
326c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
326d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a  is a no-op..  **
326e0 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20  .  ** The start 
326f0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
32700 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
32710 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20  ntains a single 
32720 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65  journal .  ** he
32730 61 64 65 72 20 77 69 74 68 20 74 68 65 20 6e 52  ader with the nR
32740 65 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20  ec field set to 
32750 30 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75  0. If such a jou
32760 72 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a  rnal is used as.
32770 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
32780 61 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  al during hot-jo
32790 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
327a0 30 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62  0 changes will b
327b0 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74  e made.  ** to t
327c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
327d0 2e 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  . So there is no
327e0 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68   need to zero th
327f0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
32800 68 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68  header. Since th
32810 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
32820 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
32830 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
32840 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20   ** to drop any 
32850 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20  locks either..  
32860 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
32870 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
32880 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  & pPager->exclus
32890 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70  iveMode .   && p
328a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
328b0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
328c0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
328d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
328e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
328f0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
32900 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
32910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32920 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  K;.  }..  PAGERT
32930 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64  RACE(("COMMIT %d
32940 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
32950 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74  ger)));.  assert
32960 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
32970 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c  =PAGER_SYNCED ||
32980 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65   MEMDB || !pPage
32990 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b  r->dbModified );
329a0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e  .  rc = pager_en
329b0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
329c0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
329d0 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  tMaster);.  retu
329e0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
329f0 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  Pager, rc);.}../
32a00 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
32a10 6c 20 63 68 61 6e 67 65 73 2e 20 54 68 65 20 64  l changes. The d
32a20 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
32a30 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
32a40 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ED mode..**.** T
32a50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72  his function per
32a60 66 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a  forms two tasks:
32a70 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72  .**.**   1) It r
32a80 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f  olls back the jo
32a90 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74  urnal file, rest
32aa0 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61  oring all databa
32ab0 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20  se file and .** 
32ac0 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63       in-memory c
32ad0 61 63 68 65 20 70 61 67 65 73 20 74 6f 20 74 68  ache pages to th
32ae0 65 20 73 74 61 74 65 20 74 68 65 79 20 77 65 72  e state they wer
32af0 65 20 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72  e in when the tr
32b00 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  ansaction.**    
32b10 20 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e    was opened, an
32b20 64 0a 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e  d.**   2) It fin
32b30 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e  alizes the journ
32b40 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74  al file, so that
32b50 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   it is not used 
32b60 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20  for hot.**      
32b70 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20  rollback at any 
32b80 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
32b90 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65  ure..**.** subje
32ba0 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ct to the follow
32bb0 69 6e 67 20 71 75 61 6c 69 66 69 63 61 74 69 6f  ing qualificatio
32bc0 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74  ns:.**.** * If t
32bd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
32be0 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20  is not yet open 
32bf0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
32c00 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  on is called,.**
32c10 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29     then only (2)
32c20 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 49   is performed. I
32c30 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
32c40 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20  e is no journal 
32c50 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c  file.**   to rol
32c60 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20  l back..**.** * 
32c70 49 66 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  If in an error s
32c80 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
32c90 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65  SQLITE_FULL, the
32ca0 6e 20 74 61 73 6b 20 28 31 29 20 69 73 20 0a 2a  n task (1) is .*
32cb0 2a 20 20 20 70 65 72 66 6f 72 6d 65 64 2e 20 49  *   performed. I
32cc0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 61  f successful, ta
32cd0 73 6b 20 28 32 29 2e 20 52 65 67 61 72 64 6c 65  sk (2). Regardle
32ce0 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d  ss of the outcom
32cf0 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68 65 72  e.**   of either
32d00 2c 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  , the error stat
32d10 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
32d20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
32d30 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65  caller.**   (i.e
32d40 2e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  . either SQLITE_
32d50 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f  IOERR or SQLITE_
32d60 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
32d70 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
32d80 73 20 69 6e 20 50 41 47 45 52 5f 52 45 53 45 52  s in PAGER_RESER
32d90 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
32da0 61 74 74 65 6d 70 74 20 28 31 29 2e 20 57 68 65  attempt (1). Whe
32db0 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74  ther.**   or not
32dc0 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73 66   (1) is successf
32dd0 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70 74  ul, also attempt
32de0 20 28 32 29 2e 20 49 66 20 73 75 63 63 65 73 73   (2). If success
32df0 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20  ful, return.**  
32e00 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
32e10 72 77 69 73 65 2c 20 65 6e 74 65 72 20 74 68 65  rwise, enter the
32e20 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
32e30 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72 73   return the firs
32e40 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f  t .**   error co
32e50 64 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20  de encountered. 
32e60 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73  .**.**   In this
32e70 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e   case there is n
32e80 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
32e90 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 77  e database was w
32ea0 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20  ritten to. .**  
32eb0 20 53 6f 20 69 73 20 73 61 66 65 20 74 6f 20 66   So is safe to f
32ec0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
32ed0 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e 20 69 66  nal file even if
32ee0 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a   the playback .*
32ef0 2a 20 20 20 28 6f 70 65 72 61 74 69 6f 6e 20 31  *   (operation 1
32f00 29 20 66 61 69 6c 65 64 2e 20 48 6f 77 65 76 65  ) failed. Howeve
32f10 72 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74  r the pager must
32f20 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
32f30 20 73 74 61 74 65 0a 2a 2a 20 20 20 61 73 20 74   state.**   as t
32f40 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
32f50 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
32f60 68 65 20 61 72 65 20 6e 6f 77 20 73 75 73 70 65  he are now suspe
32f70 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61  ct..**.** * Fina
32f80 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41 47 45 52  lly, if in PAGER
32f90 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65  _EXCLUSIVE state
32fa0 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28  , then attempt (
32fb0 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74  1). Only.**   at
32fc0 74 65 6d 70 74 20 28 32 29 20 69 66 20 28 31 29  tempt (2) if (1)
32fd0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
32fe0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
32ff0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   if successful,.
33000 2a 2a 20 20 20 6f 74 68 65 72 77 69 73 65 20 65  **   otherwise e
33010 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
33020 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tate and return 
33030 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66  the error code f
33040 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66 61  rom the .**   fa
33050 69 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  iling operation.
33060 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73  .**.**   In this
33070 20 63 61 73 65 20 74 68 65 20 64 61 74 61 62 61   case the databa
33080 73 65 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65  se file may have
33090 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
330a0 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20  . So if the.**  
330b0 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74   playback operat
330c0 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75 63 63  ion did not succ
330d0 65 65 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  eed it would not
330e0 20 62 65 20 73 61 66 65 20 74 6f 20 66 69 6e 61   be safe to fina
330f0 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f  lize.**   the jo
33100 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e  urnal file. It n
33110 65 65 64 73 20 74 6f 20 62 65 20 6c 65 66 74 20  eeds to be left 
33120 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
33130 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20  em so that.**   
33140 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
33150 73 73 20 63 61 6e 20 75 73 65 20 69 74 20 74 6f  ss can use it to
33160 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
33170 61 62 61 73 65 20 73 74 61 74 65 20 28 62 79 0a  abase state (by.
33180 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  **   hot-journal
33190 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69   rollback)..*/.i
331a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
331b0 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
331c0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
331d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
331e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
331f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
33200 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
33210 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
33220 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
33230 29 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  );.  if( pagerUs
33240 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
33250 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
33260 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33270 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 50 61  gerSavepoint(pPa
33280 67 65 72 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  ger, SAVEPOINT_R
33290 4f 4c 4c 42 41 43 4b 2c 20 2d 31 29 3b 0a 20 20  OLLBACK, -1);.  
332a0 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e    rc2 = pager_en
332b0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
332c0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
332d0 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66  tMaster);.    if
332e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
332f0 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20  ) rc = rc2;.    
33300 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
33310 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
33320 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
33330 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c  r->dbModified ||
33340 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
33350 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20  >jfd) ){.    rc 
33360 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
33370 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
33380 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
33390 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r);.  }else if( 
333a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
333b0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
333c0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
333d0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
333e0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
333f0 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
33400 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
33410 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
33420 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61    }.    rc = pPa
33430 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
33440 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
33450 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
33460 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
33470 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
33480 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
33490 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
334a0 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d   0);.      rc2 =
334b0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
334c0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
334d0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
334e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
334f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33500 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
33510 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
33520 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
33530 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
33540 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ger, 0);.    }..
33550 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
33560 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
33570 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
33580 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
33590 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
335a0 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
335b0 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
335c0 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
335d0 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63  pager.    ** cac
335e0 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65  he. So call page
335f0 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65  r_error() on the
33600 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65   way out to make
33610 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20   any error .    
33620 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
33630 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
33640 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
33650 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  r, rc);.  }.  re
33660 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33670 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
33680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33690 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
336a0 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
336b0 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
336c0 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
336d0 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
336e0 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50  ..*/.u8 sqlite3P
336f0 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
33700 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
33710 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
33720 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
33730 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
33740 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
33750 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
33760 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
33770 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
33780 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
33790 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
337a0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
337b0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
337c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
337d0 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6e 75  e approximate nu
337e0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
337f0 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c   memory currentl
33800 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65  y.** used by the
33810 20 70 61 67 65 72 20 61 6e 64 20 69 74 73 20 61   pager and its a
33820 73 73 6f 63 69 61 74 65 64 20 63 61 63 68 65 2e  ssociated cache.
33830 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
33840 61 67 65 72 4d 65 6d 55 73 65 64 28 50 61 67 65  agerMemUsed(Page
33850 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
33860 74 20 70 65 72 50 61 67 65 53 69 7a 65 20 3d 20  t perPageSize = 
33870 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
33880 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
33890 61 20 2b 20 32 30 3b 0a 20 20 72 65 74 75 72 6e  a + 20;.  return
338a0 20 70 65 72 50 61 67 65 53 69 7a 65 2a 73 71 6c   perPageSize*sql
338b0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
338c0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
338d0 63 68 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  che).           
338e0 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  + sqlite3MallocS
338f0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  ize(pPager);.}..
33900 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
33910 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
33920 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70 65  ences to the spe
33930 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
33940 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
33950 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50  PageRefcount(DbP
33960 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  age *pPage){.  r
33970 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
33980 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
33990 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65  pPage);.}..#ifde
339a0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
339b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
339c0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
339d0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
339e0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
339f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
33a00 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
33a10 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
33a20 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73  [11];.  a[0] = s
33a30 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
33a40 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
33a50 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20  ache);.  a[1] = 
33a60 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
33a70 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
33a80 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20  PCache);.  a[2] 
33a90 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 47  = sqlite3PcacheG
33aa0 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
33ab0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
33ac0 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
33ad0 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e  bSizeValid ? (in
33ae0 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t) pPager->dbSiz
33af0 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d  e : -1;.  a[4] =
33b00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
33b10 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
33b20 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
33b30 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
33b40 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
33b50 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
33b60 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f  = 0;  /* Used to
33b70 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66   be pPager->nOvf
33b80 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50  l */.  a[9] = pP
33b90 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
33ba0 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
33bb0 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
33bc0 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
33bd0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
33be0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
33bf0 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f  memory pager..*/
33c00 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
33c10 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a  rIsMemdb(Pager *
33c20 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
33c30 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a  n MEMDB;.}../*.*
33c40 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
33c50 72 65 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  re are at least 
33c60 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70  nSavepoint savep
33c70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20 74  oints open. If t
33c80 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75 72 72  here are.** curr
33c90 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20  ently less than 
33ca0 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e  nSavepoints open
33cb0 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20  , then open one 
33cc0 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
33cd0 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70  ts.** to make up
33ce0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e   the difference.
33cf0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
33d00 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69 73 20  f savepoints is 
33d10 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c  already.** equal
33d20 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20   to nSavepoint, 
33d30 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
33d40 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
33d50 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
33d60 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
33d70 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
33d80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
33d90 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
33da0 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
33db0 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  g the sub-journa
33dc0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20  l file, then an 
33dd0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
33de0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74  .** returned. Ot
33df0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
33e00 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
33e10 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
33e20 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
33e30 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f 69  er, int nSavepoi
33e40 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
33e50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
33e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e70 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
33e80 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e  */.  int nCurren
33e90 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  t = pPager->nSav
33ea0 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f  epoint;        /
33eb0 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  * Current number
33ec0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a   of savepoints *
33ed0 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f  /..  if( nSavepo
33ee0 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26 26 20  int>nCurrent && 
33ef0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
33f00 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  al ){.    int ii
33f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f30 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
33f40 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61  riable */.    Pa
33f50 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e  gerSavepoint *aN
33f60 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
33f70 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50 61 67        /* New Pag
33f80 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72  er.aSavepoint ar
33f90 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
33fa0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
33fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fc0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
33fd0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
33fe0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33ff0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
34000 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
34010 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
34020 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20  urn rc;..    /* 
34030 47 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e 61  Grow the Pager.a
34040 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20  Savepoint array 
34050 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29 2e  using realloc().
34060 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   Return SQLITE_N
34070 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74  OMEM.    ** if t
34080 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  he allocation fa
34090 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ils. Otherwise, 
340a0 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70 6f 72  zero the new por
340b0 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 20 0a  tion in case a .
340c0 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61      ** malloc fa
340d0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
340e0 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 69 74  le populating it
340f0 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29   in the for(...)
34100 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20 20   loop below..   
34110 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d 20 28   */.    aNew = (
34120 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
34130 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28  )sqlite3Realloc(
34140 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
34150 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73 69 7a  >aSavepoint, siz
34160 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69  eof(PagerSavepoi
34170 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a 20  nt)*nSavepoint. 
34180 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
34190 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74  New ){.      ret
341a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
341b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
341c0 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72 65 6e  et(&aNew[nCurren
341d0 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70 6f 69  t], 0, (nSavepoi
341e0 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a 20 73  nt-nCurrent) * s
341f0 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
34200 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50 61 67  oint));.    pPag
34210 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
34220 20 61 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 50   aNew;..    /* P
34230 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61 67 65  opulate the Page
34240 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63  rSavepoint struc
34250 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63  tures just alloc
34260 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ated. */.    for
34270 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69  (ii=nCurrent; ii
34280 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  <nSavepoint; ii+
34290 2b 29 7b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69  +){.      aNew[i
342a0 69 5d 2e 6e 4f 72 69 67 20 3d 20 6e 50 61 67 65  i].nOrig = nPage
342b0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  ;.      if( isOp
342c0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
342d0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
342e0 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20  alOff>0 ){.     
342f0 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66     aNew[ii].iOff
34300 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
34310 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20  urnalOff;.      
34320 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
34330 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20  New[ii].iOffset 
34340 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
34350 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
34360 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  }.      aNew[ii]
34370 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61 67 65  .iSubRec = pPage
34380 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20 20 20  r->nSubRec;.    
34390 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61    aNew[ii].pInSa
343a0 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65  vepoint = sqlite
343b0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 6e 50  3BitvecCreate(nP
343c0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
343d0 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76  !aNew[ii].pInSav
343e0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
343f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34400 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
34410 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73       if( pagerUs
34420 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
34430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
34440 61 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67  alSavepoint(pPag
34450 65 72 2d 3e 70 57 61 6c 2c 20 61 4e 65 77 5b 69  er->pWal, aNew[i
34460 69 5d 2e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  i].aWalData);.  
34470 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
34480 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
34490 20 69 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20   ii+1;.    }.   
344a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
344b0 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 6e 53 61  >nSavepoint==nSa
344c0 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20 20 61  vepoint );.    a
344d0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
344e0 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b  straint(pPager);
344f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
34500 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
34510 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
34520 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
34530 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d  or release (comm
34540 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e  it) a savepoint.
34550 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e  .** The savepoin
34560 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20  t to release or 
34570 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f  rollback need no
34580 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65  t be the most re
34590 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74  cently .** creat
345a0 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ed savepoint..**
345b0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70  .** Parameter op
345c0 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
345d0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
345e0 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e  BACK or SAVEPOIN
345f0 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66  T_RELEASE..** If
34600 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
34610 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72  _RELEASE, then r
34620 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72  elease and destr
34630 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  oy the savepoint
34640 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69   with.** index i
34650 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74  Savepoint. If it
34660 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
34670 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c  LLBACK, then rol
34680 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
34690 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f  s.** that have o
346a0 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74 68  ccurred since th
346b0 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
346c0 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65  point was create
346d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76  d..**.** The sav
346e0 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61  epoint to rollba
346f0 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73  ck or release is
34700 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
34710 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61  arameter .** iSa
34720 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65  vepoint. A value
34730 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f   of 0 means to o
34740 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75  perate on the ou
34750 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
34760 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20  t.** (the first 
34770 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75  created). A valu
34780 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76  e of (Pager.nSav
34790 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20  epoint-1) means 
347a0 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68  operate.** on th
347b0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
347c0 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e  created savepoin
347d0 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74  t. If iSavepoint
347e0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
347f0 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65  .** (Pager.nSave
34800 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74  point-1), then t
34810 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
34820 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
34830 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  f a negative val
34840 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ue is passed to 
34850 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
34860 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
34870 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
34880 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  s rolled back. T
34890 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
348a0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20   to calling .** 
348b0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
348c0 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20 74  back() because t
348d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
348e0 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a  s not terminate.
348f0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
34900 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  on or unlock the
34910 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75   database, it ju
34920 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65 20  st restores the 
34930 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
34940 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
34950 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
34960 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  te. .**.** In an
34970 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65  y case, all save
34980 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69  points with an i
34990 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
349a0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  n iSavepoint .**
349b0 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20   are destroyed. 
349c0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
349d0 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  ease operation (
349e0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
349f0 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20  LEASE),.** then 
34a00 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70  savepoint iSavep
34a10 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73  oint is also des
34a20 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  troyed..**.** Th
34a30 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
34a40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
34a50 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  MEM if a memory 
34a60 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
34a70 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72  ,.** or an IO er
34a80 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49  ror code if an I
34a90 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
34aa0 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  hile rolling bac
34ab0 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  k a .** savepoin
34ac0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20  t. If no errors 
34ad0 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
34ae0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
34af0 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67   .int sqlite3Pag
34b00 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  erSavepoint(Page
34b10 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f  r *pPager, int o
34b20 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
34b30 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
34b40 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
34b50 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
34b60 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
34b70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
34b80 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  BACK );.  assert
34b90 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
34ba0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
34bb0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20  _ROLLBACK );..  
34bc0 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70  if( iSavepoint<p
34bd0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
34be0 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  t ){.    int ii;
34bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
34c00 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
34c10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77   */.    int nNew
34c20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
34c30 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e  mber of remainin
34c40 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74  g savepoints aft
34c50 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a  er this op. */..
34c60 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
34c70 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70  t how many savep
34c80 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c  oints will still
34c90 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72   be active after
34ca0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65   this.    ** ope
34cb0 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68  ration. Store th
34cc0 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77  is value in nNew
34cd0 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f  . Then free reso
34ce0 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  urces associated
34cf0 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e   .    ** with an
34d00 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61  y savepoints tha
34d10 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 20  t are destroyed 
34d20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
34d30 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e  n..    */.    nN
34d40 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20  ew = iSavepoint 
34d50 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  + (( op==SAVEPOI
34d60 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 3f 20 30  NT_RELEASE ) ? 0
34d70 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69   : 1);.    for(i
34d80 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65  i=nNew; ii<pPage
34d90 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
34da0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
34db0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
34dc0 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
34dd0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
34de0 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
34df0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
34e00 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20  int = nNew;..   
34e10 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
34e20 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20   release of the 
34e30 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
34e40 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20  int, truncate . 
34e50 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
34e60 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79  urnal to zero by
34e70 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a  tes in size. */.
34e80 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45      if( op==SAVE
34e90 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b  POINT_RELEASE ){
34ea0 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3d  .      if( nNew=
34eb0 3d 30 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  =0 && isOpen(pPa
34ec0 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
34ed0 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 72        /* Only tr
34ee0 75 6e 63 61 74 65 20 69 66 20 69 74 20 69 73 20  uncate if it is 
34ef0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62  an in-memory sub
34f00 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20  -journal. */.   
34f10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
34f20 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
34f30 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
34f40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
34f50 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
34f60 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b  Pager->sjfd, 0);
34f70 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
34f80 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
34f90 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
34fa0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53        pPager->nS
34fb0 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  ubRec = 0;.     
34fc0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20   }.    }.    /* 
34fd0 45 6c 73 65 20 74 68 69 73 20 69 73 20 61 20 72  Else this is a r
34fe0 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
34ff0 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20  n, playback the 
35000 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f  specified savepo
35010 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  int..    ** If t
35020 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69  his is a temp-fi
35030 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  le, it is possib
35040 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  le that the jour
35050 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20  nal file has.   
35060 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e   ** not yet been
35070 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
35080 20 63 61 73 65 20 74 68 65 72 65 20 68 61 76 65   case there have
35090 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   been no changes
350a0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
350b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f  atabase file, so
350c0 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70   the playback op
350d0 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73  eration can be s
350e0 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  kipped..    */. 
350f0 20 20 20 65 6c 73 65 20 69 66 28 20 70 61 67 65     else if( page
35100 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
35110 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
35120 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
35130 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
35140 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e  pSavepoint = (nN
35150 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72  ew==0)?0:&pPager
35160 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65  ->aSavepoint[nNe
35170 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  w-1];.      rc =
35180 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
35190 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20  vepoint(pPager, 
351a0 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  pSavepoint);.   
351b0 20 20 20 61 73 73 65 72 74 28 72 63 21 3d 53 51     assert(rc!=SQ
351c0 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20  LITE_DONE);.    
351d0 7d 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  }.  .  }.  retur
351e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
351f0 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
35200 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
35210 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
35220 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
35230 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
35240 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
35250 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
35260 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
35270 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
35280 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20  e VFS structure 
35290 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  for the pager..*
352a0 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
352b0 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65  vfs *sqlite3Page
352c0 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67  rVfs(Pager *pPag
352d0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
352e0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f  ager->pVfs;.}../
352f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
35300 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
35310 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35320 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
35330 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20  with the pager. 
35340 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75   This might retu
35350 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
35360 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79  ile has.** not y
35370 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  et been opened..
35380 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  */.sqlite3_file 
35390 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
353a0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
353b0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
353c0 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r->fd;.}../*.** 
353d0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
353e0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
353f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
35400 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
35410 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
35420 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
35430 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
35440 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
35450 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
35460 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20  true if fsync() 
35470 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c  calls are disabl
35480 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
35490 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
354a0 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20  .** if fsync()s 
354b0 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72  are executed nor
354c0 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mally..*/.int sq
354d0 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
354e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
354f0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
35500 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66  ->noSync;.}..#if
35510 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
35520 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f  ODEC./*.** Set o
35530 72 20 72 65 74 72 69 65 76 65 20 74 68 65 20 63  r retrieve the c
35540 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
35550 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ger.*/.static vo
35560 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
35570 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72  etCodec(.  Pager
35580 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
35590 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
355a0 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
355b0 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  ),.  void (*xCod
355c0 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
355d0 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f  *,int,int),.  vo
355e0 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
355f0 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20  (void*),.  void 
35600 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28  *pCodec.){.  if(
35610 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
35620 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
35630 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
35640 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67  >pCodec);.  pPag
35650 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50 61  er->xCodec = pPa
35660 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20 3a  ger->memDb ? 0 :
35670 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
35680 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
35690 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68  g = xCodecSizeCh
356a0 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  ng;.  pPager->xC
356b0 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65  odecFree = xCode
356c0 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d  cFree;.  pPager-
356d0 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63  >pCodec = pCodec
356e0 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74 53  ;.  pagerReportS
356f0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 73  ize(pPager);.}.s
35700 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69  tatic void *sqli
35710 74 65 33 50 61 67 65 72 47 65 74 43 6f 64 65 63  te3PagerGetCodec
35720 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
35730 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
35740 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64  ->pCodec;.}.#end
35750 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
35760 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
35770 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
35780 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f  e page pPg to lo
35790 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
357a0 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
357b0 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
357c0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
357d0 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
357e0 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20  y located at.** 
357f0 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63  pgno (which we c
35800 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75  all pPgOld) thou
35810 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20  gh that page is 
35820 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a  allowed to be.**
35830 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74   in cache.  If t
35840 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
35850 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67  ly located at pg
35860 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
35870 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c  y.** in the roll
35880 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
35890 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72   is not put ther
358a0 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75  e by by this rou
358b0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
358c0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
358d0 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61  ge pPg remain va
358e0 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
358f0 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
35900 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
35910 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  Pg (i.e. data st
35920 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
35930 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
35940 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
35950 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
35960 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
35970 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
35980 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
35990 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
359a0 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
359b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
359c0 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
359d0 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
359e0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
359f0 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
35a00 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
35a10 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
35a20 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
35a30 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
35a40 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
35a50 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
35a60 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
35a70 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
35a80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72  *.** If the four
35a90 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43  th argument, isC
35aa0 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65  ommit, is non-ze
35ab0 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ro, then this pa
35ac0 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d  ge is being.** m
35ad0 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  oved as part of 
35ae0 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72 67  a database reorg
35af0 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62  anization just b
35b00 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
35b10 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69  ction .** is bei
35b20 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e  ng committed. In
35b30 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69   this case, it i
35b40 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
35b50 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  t the database p
35b60 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65  age .** pPg refe
35b70 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62  rs to will not b
35b80 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61  e written to aga
35b90 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
35ba0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
35bb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
35bc0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
35bd0 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
35be0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
35bf0 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
35c00 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  s. Otherwise, it
35c10 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
35c20 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
35c30 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
35c40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
35c50 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
35c60 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d   pgno, int isCom
35c70 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  mit){.  PgHdr *p
35c80 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20  PgOld;          
35c90 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
35ca0 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
35cb0 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  en. */.  Pgno ne
35cc0 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20  edSyncPgno = 0; 
35cd0 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c        /* Old val
35ce0 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c  ue of pPg->pgno,
35cf0 20 69 66 20 73 79 6e 63 20 69 73 20 72 65 71 75   if sync is requ
35d00 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ired */.  int rc
35d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35d20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
35d30 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   code */.  Pgno 
35d40 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20 20 20  origPgno;       
35d50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
35d60 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d  riginal page num
35d70 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ber */..  assert
35d80 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
35d90 0a 0a 20 20 2f 2a 20 49 6e 20 6f 72 64 65 72 20  ..  /* In order 
35da0 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  to be able to ro
35db0 6c 6c 62 61 63 6b 2c 20 61 6e 20 69 6e 2d 6d 65  llback, an in-me
35dc0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6d 75  mory database mu
35dd0 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  st journal.  ** 
35de0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
35df0 6d 6f 76 69 6e 67 20 66 72 6f 6d 2e 0a 20 20 2a  moving from..  *
35e00 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
35e10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
35e20 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
35e30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
35e40 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
35e50 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
35e60 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64  being moved is d
35e70 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74  irty and has not
35e80 20 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 74   been saved by t
35e90 68 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73  he latest.  ** s
35ea0 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73  avepoint, then s
35eb0 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
35ec0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
35ed0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20  page into the . 
35ee0 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   ** sub-journal 
35ef0 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65 71  now. This is req
35f00 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  uired to handle 
35f10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
35f20 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  enario:.  **.  *
35f30 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20  *   BEGIN;.  ** 
35f40 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
35f50 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79  e X, then modify
35f60 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20   it in memory>. 
35f70 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e   **     SAVEPOIN
35f80 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20  T one;.  **     
35f90 20 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74    <Move page X t
35fa0 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20  o location Y>.  
35fb0 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
35fc0 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  TO one;.  **.  *
35fd0 2a 20 49 66 20 70 61 67 65 20 58 20 77 65 72 65  * If page X were
35fe0 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
35ff0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
36000 68 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e  here, it would n
36010 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69  ot.  ** be possi
36020 62 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69  ble to restore i
36030 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e  ts contents when
36040 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
36050 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74  O one".  ** stat
36060 65 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70 72  ement were is pr
36070 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  ocessed..  **.  
36080 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  ** subjournalPag
36090 65 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20  e() may need to 
360a0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74  allocate space t
360b0 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e  o store pPg->pgn
360c0 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20  o into.  ** one 
360d0 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
360e0 74 20 62 69 74 76 65 63 73 2e 20 54 68 69 73 20  t bitvecs. This 
360f0 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68  is the reason th
36100 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
36110 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
36120 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20  TE_NOMEM..  */. 
36130 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
36140 50 47 48 44 52 5f 44 49 52 54 59 0a 20 20 20 26  PGHDR_DIRTY.   &
36150 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
36160 67 65 28 70 50 67 29 0a 20 20 20 26 26 20 53 51  ge(pPg).   && SQ
36170 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
36180 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
36190 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  g)).  ){.    ret
361a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
361b0 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45  AGERTRACE(("MOVE
361c0 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65   %d page %d (nee
361d0 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20  dSync=%d) moves 
361e0 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  to %d\n", .     
361f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
36200 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50  , pPg->pgno, (pP
36210 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
36220 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70  EED_SYNC)?1:0, p
36230 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  gno));.  IOTRACE
36240 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
36250 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
36260 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
36270 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
36280 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
36290 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
362a0 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63  page pPg->pgno c
362b0 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  an.  ** be writt
362c0 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67  en to, store pPg
362d0 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20  ->pgno in local 
362e0 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e  variable needSyn
362f0 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cPgno..  **.  **
36300 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74   If the isCommit
36310 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
36320 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
36330 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
36340 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
36350 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
36360 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
36370 61 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e  abase page pPg->
36380 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62  pgno .  ** can b
36390 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
363a0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
363b0 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
363c0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74  t to write to it
363d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  ..  */.  if( (pP
363e0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
363f0 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73  EED_SYNC) && !is
36400 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65  Commit ){.    ne
36410 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
36420 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
36430 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  rt( pageInJourna
36440 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  l(pPg) || pPg->p
36450 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
36460 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  igSize );.    as
36470 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
36480 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
36490 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
364a0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
364b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
364c0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
364d0 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
364e0 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
364f0 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
36500 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e  m its hash chain
36510 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
36520 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
36530 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
36540 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
36550 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
36560 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
36570 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
36580 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
36590 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
365a0 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
365b0 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
365c0 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d  SYNC;.  pPgOld =
365d0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
365e0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
365f0 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c  ssert( !pPgOld |
36600 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  | pPgOld->nRef==
36610 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  1 );.  if( pPgOl
36620 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c  d ){.    pPg->fl
36630 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e  ags |= (pPgOld->
36640 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
36650 5f 53 59 4e 43 29 3b 0a 20 20 20 20 69 66 28 20  _SYNC);.    if( 
36660 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  MEMDB ){.      /
36670 2a 20 44 6f 20 6e 6f 74 20 64 69 73 63 61 72 64  * Do not discard
36680 20 70 61 67 65 73 20 66 72 6f 6d 20 61 6e 20 69   pages from an i
36690 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
366a0 65 20 73 69 6e 63 65 20 77 65 20 6d 69 67 68 74  e since we might
366b0 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74  .      ** need t
366c0 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 61 74 65 72  o rollback later
366d0 2e 20 20 4a 75 73 74 20 6d 6f 76 65 20 74 68 65  .  Just move the
366e0 20 70 61 67 65 20 6f 75 74 20 6f 66 20 74 68 65   page out of the
366f0 20 77 61 79 2e 20 2a 2f 0a 20 20 20 20 20 20 61   way. */.      a
36700 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
36710 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
36720 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
36730 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 70 50  eMove(pPgOld, pP
36740 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31 29 3b  ager->dbSize+1);
36750 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36760 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
36770 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20  rop(pPgOld);.   
36780 20 7d 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67   }.  }..  origPg
36790 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
367a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
367b0 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a  ove(pPg, pgno);.
367c0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
367d0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
367e0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
367f0 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  ied = 1;..  if( 
36800 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
36810 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
36820 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
36830 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
36840 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
36850 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
36860 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
36870 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
36880 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
36890 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
368a0 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
368b0 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
368c0 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
368d0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
368e0 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69  d the .    ** "i
368f0 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74  s journaled" bit
36900 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  vec flag has bee
36910 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
36920 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
36930 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69   by.    ** loadi
36940 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ng the page into
36950 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
36960 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
36970 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
36980 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20  .    ** flag..  
36990 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
369a0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  he attempt to lo
369b0 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ad the page into
369c0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
369d0 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20  fails, (due.    
369e0 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29  ** to a malloc()
369f0 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c   or IO failure),
36a00 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69   clear the bit i
36a10 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c  n the pInJournal
36a20 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e  [].    ** array.
36a30 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
36a40 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  he page is loade
36a50 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67  d and written ag
36a60 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ain in.    ** th
36a70 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
36a80 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  it may be writte
36a90 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
36aa0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20  e file before.  
36ab0 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65    ** it is synce
36ac0 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  d into the journ
36ad0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61  al file. This wa
36ae0 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70  y, it may end up
36af0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
36b00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63  ournal file twic
36b10 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  e, but that is n
36b20 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  ot a problem..  
36b30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
36b40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
36b50 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
36b60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
36b70 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
36b80 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
36b90 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
36ba0 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
36bb0 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a    */.    PgHdr *
36bc0 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
36bd0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
36be0 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
36bf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
36c00 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
36c10 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
36c20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
36c30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36c40 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
36c50 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
36c60 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
36c70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36c80 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a  pTmpSpace!=0 );.
36c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
36ca0 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65  itvecClear(pPage
36cb0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e  r->pInJournal, n
36cc0 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61  eedSyncPgno, pPa
36cd0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
36ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
36cf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
36d00 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
36d10 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73  Sync = 1;.    as
36d20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f  sert( pPager->no
36d30 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44  Sync==0 && !MEMD
36d40 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  B );.    pPgHdr-
36d50 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
36d60 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73  NEED_SYNC;.    s
36d70 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
36d80 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
36d90 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
36da0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
36db0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72  }..  /*.  ** For
36dc0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
36dd0 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72  tabase, make sur
36de0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
36df0 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20  age continues.  
36e00 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20  ** to exist, in 
36e10 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63  case the transac
36e20 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f  tion needs to ro
36e30 6c 6c 20 62 61 63 6b 2e 20 20 55 73 65 20 70 50  ll back.  Use pP
36e40 67 4f 6c 64 0a 20 20 2a 2a 20 61 73 20 74 68 65  gOld.  ** as the
36e50 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 73   original page s
36e60 69 6e 63 65 20 69 74 20 68 61 73 20 61 6c 72 65  ince it has alre
36e70 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
36e80 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  ed..  */.  if( M
36e90 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c 69  EMDB ){.    sqli
36ea0 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
36eb0 67 4f 6c 64 2c 20 6f 72 69 67 50 67 6e 6f 29 3b  gOld, origPgno);
36ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
36ed0 72 55 6e 72 65 66 28 70 50 67 4f 6c 64 29 3b 0a  rUnref(pPgOld);.
36ee0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
36ef0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
36f00 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
36f10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
36f20 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
36f30 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
36f40 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
36f50 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
36f60 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  e *pPg){.  asser
36f70 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c  t( pPg->nRef>0 |
36f80 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d  | pPg->pPager->m
36f90 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e  emDb );.  return
36fa0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a   pPg->pData;.}..
36fb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
36fc0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
36fd0 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
36fe0 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63   of "extra" spac
36ff0 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  e .** allocated 
37000 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73  along with the s
37010 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
37020 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
37030 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50  agerGetExtra(DbP
37040 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
37050 75 72 6e 20 70 50 67 2d 3e 70 45 78 74 72 61 3b  urn pPg->pExtra;
37060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
37070 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
37080 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
37090 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
370a0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
370b0 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
370c0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
370d0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
370e0 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
370f0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
37100 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
37110 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
37120 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
37130 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
37140 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
37150 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
37160 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
37170 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
37180 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
37190 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
371a0 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
371b0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
371c0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
371d0 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
371e0 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
371f0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
37200 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
37210 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
37220 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
37230 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
37240 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
37250 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
37260 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
37270 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
37280 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
37290 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
372a0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
372b0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
372c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
372d0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
372e0 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
372f0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
37300 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
37310 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
37320 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
37330 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
37340 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
37350 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
37360 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
37370 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  veMode = (u8)eMo
37380 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
37390 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
373a0 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
373b0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6a 6f  /*.** Set the jo
373c0 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74  urnal-mode for t
373d0 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
373e0 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
373f0 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  be one of:.**.**
37400 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
37410 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  LMODE_DELETE.** 
37420 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
37430 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a  MODE_TRUNCATE.**
37440 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
37450 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a  LMODE_PERSIST.**
37460 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
37470 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20  LMODE_OFF.**    
37480 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37490 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 50  E_MEMORY.**    P
374a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
374b0 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  _WAL.**.** The j
374c0 6f 75 72 6e 61 6c 6d 6f 64 65 20 69 73 20 73 65  ournalmode is se
374d0 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
374e0 70 65 63 69 66 69 65 64 20 69 66 20 74 68 65 20  pecified if the 
374f0 63 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f 77 65  change is allowe
37500 64 2e 0a 2a 2a 20 54 68 65 20 63 68 61 6e 67 65  d..** The change
37510 20 6d 61 79 20 62 65 20 64 69 73 61 6c 6c 6f 77   may be disallow
37520 65 64 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f  ed for the follo
37530 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 2a 2a  wing reasons:.**
37540 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e 2d 6d  .**   *  An in-m
37550 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 63  emory database c
37560 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69 74 73  an only have its
37570 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 65   journal_mode se
37580 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20 20 20  t to _OFF.**    
37590 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a    or _MEMORY..**
375a0 0a 2a 2a 20 20 20 2a 20 20 54 65 6d 70 6f 72 61  .**   *  Tempora
375b0 72 79 20 64 61 74 61 62 61 73 65 73 20 63 61 6e  ry databases can
375c0 6e 6f 74 20 68 61 76 65 20 5f 57 41 4c 20 6a 6f  not have _WAL jo
375d0 75 72 6e 61 6c 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  urnalmode..**.**
375e0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 69 6e   The returned in
375f0 64 69 63 61 74 65 20 74 68 65 20 63 75 72 72 65  dicate the curre
37600 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
37610 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  ated) journal-mo
37620 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
37630 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61  e3PagerSetJourna
37640 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  lMode(Pager *pPa
37650 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
37660 0a 20 20 75 38 20 65 4f 6c 64 20 3d 20 70 50 61  .  u8 eOld = pPa
37670 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
37680 3b 20 20 20 20 2f 2a 20 50 72 69 6f 72 20 6a 6f  ;    /* Prior jo
37690 75 72 6e 61 6c 6d 6f 64 65 20 2a 2f 0a 0a 20 20  urnalmode */..  
376a0 2f 2a 20 54 68 65 20 65 4d 6f 64 65 20 70 61 72  /* The eMode par
376b0 61 6d 65 74 65 72 20 69 73 20 61 6c 77 61 79 73  ameter is always
376c0 20 76 61 6c 69 64 20 2a 2f 0a 20 20 61 73 73 65   valid */.  asse
376d0 72 74 28 20 20 20 20 20 20 65 4d 6f 64 65 3d 3d  rt(      eMode==
376e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
376f0 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
37700 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
37710 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37720 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20  _TRUNCATE.      
37730 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
37740 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37750 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
37760 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
37770 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37780 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
37790 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
377a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
377b0 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL .            
377c0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
377d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
377e0 52 59 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  RY );..  /* Do n
377f0 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 6a 6f 75  ot allow the jou
37800 72 6e 61 6c 6d 6f 64 65 20 6f 66 20 61 20 54 45  rnalmode of a TE
37810 4d 50 20 64 61 74 61 62 61 73 65 20 74 6f 20 62  MP database to b
37820 65 20 63 68 61 6e 67 65 64 20 74 6f 20 57 41 4c  e changed to WAL
37830 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
37840 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
37850 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
37860 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
37870 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 6c 64      assert( eOld
37880 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
37890 4f 44 45 5f 57 41 4c 20 29 3b 0a 20 20 20 20 65  ODE_WAL );.    e
378a0 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d  Mode = eOld;.  }
378b0 0a 0a 20 20 2f 2a 20 44 6f 20 61 6c 6c 6f 77 20  ..  /* Do allow 
378c0 74 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20  the journalmode 
378d0 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  of an in-memory 
378e0 64 61 74 61 62 61 73 65 20 74 6f 20 62 65 20 73  database to be s
378f0 65 74 20 74 6f 0a 20 20 2a 2a 20 61 6e 79 74 68  et to.  ** anyth
37900 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 4d  ing other than M
37910 45 4d 4f 52 59 20 6f 72 20 4f 46 46 0a 20 20 2a  EMORY or OFF.  *
37920 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
37930 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 6c  .    assert( eOl
37940 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  d==PAGER_JOURNAL
37950 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 65  MODE_MEMORY || e
37960 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  Old==PAGER_JOURN
37970 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20  ALMODE_OFF );.  
37980 20 20 69 66 28 20 65 4d 6f 64 65 21 3d 50 41 47    if( eMode!=PAG
37990 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
379a0 45 4d 4f 52 59 20 26 26 20 65 4d 6f 64 65 21 3d  EMORY && eMode!=
379b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
379c0 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 65  E_OFF ){.      e
379d0 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b 0a 20 20 20  Mode = eOld;.   
379e0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 4d   }.  }..  if( eM
379f0 6f 64 65 21 3d 65 4f 6c 64 20 29 7b 0a 20 20 20  ode!=eOld ){.   
37a00 20 2f 2a 20 57 68 65 6e 20 63 68 61 6e 67 69 6e   /* When changin
37a10 67 20 62 65 74 77 65 65 6e 20 72 6f 6c 6c 62 61  g between rollba
37a20 63 6b 20 6d 6f 64 65 73 2c 20 63 6c 6f 73 65 20  ck modes, close 
37a30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37a40 20 70 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 6f   prior.    ** to
37a50 20 74 68 65 20 63 68 61 6e 67 65 2e 20 20 42 75   the change.  Bu
37a60 74 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20  t when changing 
37a70 66 72 6f 6d 20 61 20 72 6f 6c 6c 62 61 63 6b 20  from a rollback 
37a80 6d 6f 64 65 20 74 6f 20 57 41 4c 2c 20 6b 65 65  mode to WAL, kee
37a90 70 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  p.    ** the jou
37aa0 72 6e 61 6c 20 6f 70 65 6e 20 73 69 6e 63 65 20  rnal open since 
37ab0 74 68 65 72 65 20 69 73 20 61 20 72 6f 6c 6c 62  there is a rollb
37ac0 61 63 6b 2d 73 74 79 6c 65 20 74 72 61 6e 73 61  ack-style transa
37ad0 63 74 69 6f 6e 20 69 6e 20 70 6c 61 79 0a 20 20  ction in play.  
37ae0 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 63 6f 6e    ** used to con
37af0 76 65 72 74 20 74 68 65 20 76 65 72 73 69 6f 6e  vert the version
37b00 20 6e 75 6d 62 65 72 73 20 69 6e 20 74 68 65 20   numbers in the 
37b10 62 74 72 65 65 20 68 65 61 64 65 72 2e 0a 20 20  btree header..  
37b20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
37b30 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
37b40 20 26 26 20 65 4d 6f 64 65 21 3d 50 41 47 45 52   && eMode!=PAGER
37b50 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
37b60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
37b70 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
37b80 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
37b90 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
37ba0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 2a 2f  journal mode. */
37bb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
37bc0 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65  rnalMode = (u8)e
37bd0 4d 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  Mode;..    /* Wh
37be0 65 6e 20 74 72 61 6e 73 69 73 74 69 6f 6e 69 6e  en transistionin
37bf0 67 20 66 72 6f 6d 20 54 52 55 4e 43 41 54 45 20  g from TRUNCATE 
37c00 6f 72 20 50 45 52 53 49 53 54 20 74 6f 20 61 6e  or PERSIST to an
37c10 79 20 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 0a  y other journal.
37c20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 65 78 63 65      ** mode exce
37c30 70 74 20 57 41 4c 20 28 61 6e 64 20 77 65 20 61  pt WAL (and we a
37c40 72 65 20 6e 6f 74 20 69 6e 20 6c 6f 63 6b 69 6e  re not in lockin
37c50 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
37c60 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 64  ) then .    ** d
37c70 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
37c80 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  l file..    */. 
37c90 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
37ca0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
37cb0 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29  UNCATE & 5)==1 )
37cc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
37cd0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37ce0 5f 50 45 52 53 49 53 54 20 26 20 35 29 3d 3d 31  _PERSIST & 5)==1
37cf0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37d00 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
37d10 44 45 5f 44 45 4c 45 54 45 20 26 20 35 29 3d 3d  DE_DELETE & 5)==
37d20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
37d30 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
37d40 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 20 35 29 3d  ODE_MEMORY & 5)=
37d50 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
37d60 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
37d70 4d 4f 44 45 5f 4f 46 46 20 26 20 35 29 3d 3d 30  MODE_OFF & 5)==0
37d80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37d90 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
37da0 44 45 5f 57 41 4c 20 26 20 35 29 3d 3d 35 20 29  DE_WAL & 5)==5 )
37db0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ;..    assert( i
37dc0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
37dd0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63  ) || pPager->exc
37de0 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20  lusiveMode );.  
37df0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
37e00 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
37e10 28 65 4f 6c 64 20 26 20 35 29 3d 3d 31 20 26 26  (eOld & 5)==1 &&
37e20 20 28 65 4d 6f 64 65 20 26 20 31 29 3d 3d 30 20   (eMode & 1)==0 
37e30 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  ){..      /* In 
37e40 74 68 69 73 20 63 61 73 65 20 77 65 20 77 6f 75  this case we wou
37e50 6c 64 20 6c 69 6b 65 20 74 6f 20 64 65 6c 65 74  ld like to delet
37e60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
37e70 6c 65 2e 20 49 66 20 69 74 20 69 73 0a 20 20 20  le. If it is.   
37e80 20 20 20 2a 2a 20 6e 6f 74 20 70 6f 73 73 69 62     ** not possib
37e90 6c 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  le, then that is
37ea0 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 20   not a problem. 
37eb0 44 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  Deleting the jou
37ec0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20  rnal file.      
37ed0 2a 2a 20 68 65 72 65 20 69 73 20 61 6e 20 6f 70  ** here is an op
37ee0 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e  timization only.
37ef0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
37f00 2a 2a 20 42 65 66 6f 72 65 20 64 65 6c 65 74 69  ** Before deleti
37f10 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
37f20 69 6c 65 2c 20 6f 62 74 61 69 6e 20 61 20 52 45  ile, obtain a RE
37f30 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
37f40 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
37f50 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
37f60 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
37f70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
37f80 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 20 20 20   not deleted.   
37f90 20 20 20 2a 2a 20 77 68 69 6c 65 20 69 74 20 69     ** while it i
37fa0 73 20 69 6e 20 75 73 65 20 62 79 20 73 6f 6d 65  s in use by some
37fb0 20 6f 74 68 65 72 20 63 6c 69 65 6e 74 2e 0a 20   other client.. 
37fc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
37fd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37fe0 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 74  ;.      int stat
37ff0 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  e = pPager->stat
38000 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61  e;.      if( sta
38010 74 65 3c 50 41 47 45 52 5f 53 48 41 52 45 44 20  te<PAGER_SHARED 
38020 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
38030 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
38040 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
38050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
38060 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
38070 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
38080 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
38090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
380a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
380b0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
380c0 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
380d0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
380e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
380f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
38100 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
38110 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
38120 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
38130 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
38140 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
38150 4c 49 54 45 5f 4f 4b 20 26 26 20 73 74 61 74 65  LITE_OK && state
38160 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
38170 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
38180 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
38190 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
381a0 4b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  K);.      }else 
381b0 69 66 28 20 73 74 61 74 65 3d 3d 50 41 47 45 52  if( state==PAGER
381c0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
381d0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
381e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
381f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
38200 74 61 74 65 3d 3d 70 50 61 67 65 72 2d 3e 73 74  tate==pPager->st
38210 61 74 65 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ate );.    }.  }
38220 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
38230 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f  e new journal mo
38240 64 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  de */.  return (
38250 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72  int)pPager->jour
38260 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalMode;.}../*.*
38270 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
38280 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  rent journal mod
38290 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
382a0 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c  3PagerGetJournal
382b0 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
382c0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 69  er){.  return (i
382d0 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  nt)pPager->journ
382e0 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  alMode;.}../*.**
382f0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
38300 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
38310 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  a state where it
38320 20 69 73 20 4f 4b 20 74 6f 20 63 68 61 6e 67 65   is OK to change
38330 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 6d   the.** journalm
38340 6f 64 65 2e 20 20 4a 6f 75 72 6e 61 6c 6d 6f 64  ode.  Journalmod
38350 65 20 63 68 61 6e 67 65 73 20 63 61 6e 20 6f 6e  e changes can on
38360 6c 79 20 68 61 70 70 65 6e 20 77 68 65 6e 20 74  ly happen when t
38370 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
38380 73 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  s unmodified..*/
38390 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
383a0 72 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e  rOkToChangeJourn
383b0 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  alMode(Pager *pP
383c0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
383d0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
383e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
383f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
38400 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
38410 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 20  >journalOff>0 ) 
38420 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
38430 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 1;.}../*.** G
38440 65 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d  et/set the size-
38450 6c 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70  limit used for p
38460 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
38470 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  l files..**.** S
38480 65 74 74 69 6e 67 20 74 68 65 20 73 69 7a 65 20  etting the size 
38490 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e  limit to -1 mean
384a0 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e  s no limit is en
384b0 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74  forced..** An at
384c0 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 6c  tempt to set a l
384d0 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20 74 68 61  imit smaller tha
384e0 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n -1 is a no-op.
384f0 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50  .*/.i64 sqlite3P
38500 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c  agerJournalSizeL
38510 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
38520 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b  er, i64 iLimit){
38530 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d  .  if( iLimit>=-
38540 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 ){.    pPager-
38550 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
38560 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a  t = iLimit;.  }.
38570 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
38580 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
38590 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
385a0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
385b0 74 68 65 20 70 50 61 67 65 72 2d 3e 70 42 61 63  the pPager->pBac
385c0 6b 75 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68  kup variable. Th
385d0 65 20 62 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a  e backup module.
385e0 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d  ** in backup.c m
385f0 61 69 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e  aintains the con
38600 74 65 6e 74 20 6f 66 20 74 68 69 73 20 76 61 72  tent of this var
38610 69 61 62 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75  iable. This modu
38620 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74 20 6f 70  le.** uses it op
38630 61 71 75 65 6c 79 20 61 73 20 61 6e 20 61 72 67  aquely as an arg
38640 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33  ument to sqlite3
38650 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 29 20  BackupRestart() 
38660 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61  and.** sqlite3Ba
38670 63 6b 75 70 55 70 64 61 74 65 28 29 20 6f 6e 6c  ckupUpdate() onl
38680 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61  y..*/.sqlite3_ba
38690 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65 33 50 61  ckup **sqlite3Pa
386a0 67 65 72 42 61 63 6b 75 70 50 74 72 28 50 61 67  gerBackupPtr(Pag
386b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
386c0 65 74 75 72 6e 20 26 70 50 61 67 65 72 2d 3e 70  eturn &pPager->p
386d0 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 69 66 6e 64  Backup;.}..#ifnd
386e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
386f0 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
38700 6e 63 74 69 6f 6e 20 69 73 20 63